@23z86: Bei der Anmerkung dass das importierte `QtWidgets` nirgends verwendet wird, war als Konsequenz angedacht den unnötigen Import zu entfernen, nicht verwirrenderweise *eine* Verwendung des importierten `QMainWindow` unnötigerweise über diesen vorher unbenutzten Import zu machen. Was sollte denn der Sinn davon sein und nach welchem Kriterium wurde entschieden welches `QMainWindow` ersetzt wird? Warum nicht das andere? Warum nicht beide? Oder eben: warum überhaupt‽
`QDialog` wird immer noch importiert und nirgends verwendet. Warum? Könnte es denn verwendet werden? Also benutzt `AddObjectWindow` überhaupt irgend eine Eigenschaft eines `QMainWindow`? Oder könnte das ein Dialog sein/werden? Denn jetzt entspricht das Programm ja nicht mehr der ursprünglichen Beschreibung, dass immer nur eines der beiden Fenster sichtbar sein soll. Wäre bei einem modalen Dialog auch nicht ganz der Fall — da wären dann beide Fenster sichtbar — aber wenn der Dialog aktiv wäre, dann könnte man das andere Fenster wenigstens nicht benutzen. Im Moment kann man man da ja weiterhin auf den Button klicken und neue `AddObjectWindow`-Exemplare erstellen. Wobei die alten dann nicht mehr vom Programm direkt referenzierbar werden, was das Attribut unsinnig macht.
Wenn Deine Literatur noch Python 2 Code zeigt, solltest Du die wirklich austauschen. Noch mal: `super()` braucht keine Argumente. Das war in Python 2 so. Python 2 ist seit über einem Jahr EOL.
`showAddObjectWindow()` ist als Name ein bisschen irreführend. Das erstellt ein komplettes Fensterobjekt und zeigt nicht nur ein bestehendes an, wie das die `show()`-Methode macht.
Attribute sollten nach Ablauf der `__init__()`-Methode alle bestehen und nicht in späteren Methodenaufrufen neu hinzukommen.
Bei Namen kann man ja noch argumentieren das man bei GUI-Code den Qt-Stil verwendet, aber ”PascalCase” verwendet auch Qt nicht für Methodennamen. Das ist bei beiden Stilen Klassen vorbehalten. Weshalb `saveObject` ein sehr ungünstiger Name für den Button ist der die `saveObjekt()`-Methode aufrufen soll.
Für die `CloseAddObjectWindow()` gilt wieder das für Einführen von neuen Attributen in Methoden gesagte. Aber es macht auch überhaupt gar keinen Sinn die Klasse als Attribut auf einem Exemplar dieser Klasse zu setzen. Und das unmittelbar vor dem Schliessen des Fensters‽ Damit ist die komplette Methode überflüssig, denn man könnte da einfach die `close()`-Methode mit dem Button verbinden.
Warum man unsinnige Nummernanhängsel und überflüssige Unterstriche die in neuen Bibliotheksversionen *falsch* werden, nicht einfach weglassen kann, verstehe ich nicht.
Code: Alles auswählen
#!/usr/bin/env python3
import sys
from PyQt5.uic import loadUi
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog
class StartWindow(QMainWindow):
def __init__(self):
super().__init__()
loadUi("start.ui", self)
self.fz1_button.clicked.connect(self.createAddObjectWindow)
self.add_object_window = None
def createAddObjectWindow(self):
#
# FIXME There is nothing to prevent this method being called several
# times. Either this is a programming error or the attribute is
# unnecessary.
#
# Also the attribute keeps being bound to the `AddObjectWindow`
# instance after that window is destroyed. Does that make any sense?
#
self.add_object_window = AddObjectWindow()
self.add_object_window.show()
class AddObjectWindow(QMainWindow):
def __init__(self):
super().__init__()
loadUi("addobject.ui", self)
self.abortButton.clicked.connect(self.close)
self.saveButton.clicked.connect(self.saveObject)
def saveObject(self):
...
def main():
app = QApplication(sys.argv)
window = StartWindow()
window.show()
sys.exit(app.exec())
if __name__ == "__main__":
main()