Ein QApplication, mehrere Module

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
luetzeljeman
User
Beiträge: 1
Registriert: Mittwoch 9. November 2022, 07:35

Hallo,
ich entwickle eine PyQt6 - Applikation mit einem Start-Fenster mit Menues und mehreren Modulen, die die eigentliche Funktionalität enthalten und eigene Fenster präsentieren, bkomme aber beides nicht zusammen.
Das Hauptprogramm eines Moduls sieht so aus und funktioniert auch Standalone:

Code: Alles auswählen

def saal():
    app = QApplication(sys.argv)

    if not createconnection():
        sys.exit(1)
    win = PoleSaal() # class PoleSaal(QDialog, Ui_PTSSaalErfassung):
    win.show()
    sys.exit(app.exec())

if __name__ == '__main__':
    saal()
in dem Start-Programm wird "saal" importiert und ein Eintrag im Menue wird mit "saal" verknüpft:

Code: Alles auswählen

self.actionS_le_Veranstaltungsst_tten.triggered.connect(saal)
Wenn ich nun in dem Start-Programm den Menue Punkt "Saal" anwähle, erhalte ich die Meldung:

Code: Alles auswählen

QCoreApplication::exec: The event loop is already running
Soweit, so logisch, aber ich habe in den Tonnen an Dokumentation keinen Weg gefunden, wie man erreicht, dass das Modul auf die event loop des Hauptprogramms zugreift.
Gleichzeitig möchte ich aber auch weiterhin erhalten, dass ich das Modul standalone weiterentwickeln kann.

Wie ist das korrekt zu lösen?
Danke vorab!
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du darfst eben nicht saal importieren. Sondern musst PoleSaal und createconnection importieren, und benutzen. saal ist nur für den lokalen Test zu gebrauchen. Weswegen es auch eher main oder Test heißen sollte.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Das `createconnection` sieht komisch aus, denn es hat keine Argumente und keinen Rückgabewert. Was macht man mit einer Connection auf die niemand zugreifen kann?
Die Funktion `saal` heißt üblicherweise `main`, und es darf halt im gesamten Programm nur eine QApplication geben.
Weitere Fenster erzeugt man, so wie Du es ja auch machst mit `win = PoleSaal()`, und diese Zeile kann dort stehen, wo eben das neue Fenster gebraucht wird. Da es ja scheinbar ein QDialog ist, ist es sowieso komisch, weil Dialoge normalerweise modal sind, das heißt, die aufrufende Stelle wartet, bis der Dialog wieder geschlossen ist und fragt dann über die erzeugte `win`-Instanz die im Dialog eingegebenen Werte ab.
Wenn das aber in einer Funktion gekapselt ist, so dass man gar nicht auf win zugreifen kann, kann das gar nicht funktionieren.

Die Aussage `das Modul greift auf etwas zu´ ist ein falsches Bild, ein Modul ist nur eine Sammlung von Definitionen, in Deinem Fall die Definition eines Dialogs. Natürlich kannst Du eine main-Funktion haben, die den Dialog "standalone" ausführt und testet, aber diese main-Funktion ist nur für den standalone-Fall da; wie oben schon geschrieben, benutzt man die Klasse PoleSaal an der Stelle, wo man sie braucht, direkt.

Aus `Ui_PTSSaalErfassung` lese ich heraus, dass Du die ui-Datei in eine Python-Datei konvertiert hast; diesen Schritt macht man nicht explizit, sondern benutzt uic.loadUi um die ui-Datei direkt zu laden.
Antworten