Wie das MainWindow aus einem Zusatz Window ansprechen?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

Ich zermarter mir mal wieder den Kopf und es macht einfach nicht klick.

Ich habe eine Anwendung mit einem MainWindow und ein paar Zusatzfenster.

Code: Alles auswählen

    def show_settings_window(self, checked):
        from settings import SettingsWindow
        self.w2 = SettingsWindow()
        self.w2.show()

###############################################
# Prgram Loop
###############################################


if __name__ == "__main__":

    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    spinner = QtWaitingSpinner(mainWin, True, True, Qt.WindowModality.ApplicationModal)
    app.exec()
Ich möchte jetzt innerhalb des SettingsWindow einen Parameter setzen, der im MainWindow an der Toolbar was ändert. So als Beispiel was mir vorschwebt

Code: Alles auswählen

mainWin.toolbar.toolbar_restic_test.setText("TESTING")
Das funktioniert so in der Art aber leider nicht. Alles was ich probiere klappt nicht.

Hat da jemand mal einen Schubser in die richtige Richtung? Danke im Voraus.
Benutzeravatar
__blackjack__
User
Beiträge: 13075
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@FrankM: Dann musst Du das Objekt das verändert werden soll entweder dem `SettingsWindow` mitgeben, damit das darauf zugreifen kann, oder das `SettingsWindow` muss ein entsprechendes Signal senden bei Veränderung und Du musst das mit einem Slot verbinden der darauf reagiert wie Du das möchtest.

Edit: Signal/Slot ist zu bevorzugen, weil ein Einstellungsfenster eigentlich keine intimen Kenntnisse über ein Hauptfenster haben sollte, und man an einem Signal mehr als einen Zuhörer registrieren kann.

Der Import sollte nicht in der Methode stehen und `w2` ist kein guter Name. Geht die Methode sinnvoll damit um wenn sie mehr als einmal aufgerufen wird?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

__blackjack__ hat geschrieben: Donnerstag 26. Mai 2022, 16:48 Der Import sollte nicht in der Methode stehen und `w2` ist kein guter Name. Geht die Methode sinnvoll damit um wenn sie mehr als einmal aufgerufen wird?
Danke für den Input, ich hoffe verstanden zu haben was ich machen muss.

Mir ist noch kein Problem damit aufgefallen, ich werde das noch mal intensiv testen.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Unabhängig davon, ob es funktioniert: Importe gehören an den Anfang des Scripts auf Modulebene (also uneingerückt).
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

sparrow hat geschrieben: Donnerstag 26. Mai 2022, 17:01 Unabhängig davon, ob es funktioniert: Importe gehören an den Anfang des Scripts auf Modulebene (also uneingerückt).
Dank deiner Anregung habe ich das umgebaut. Entstanden war das ursprünglich, weil ich das mal zum Testen umgebaut hatte und dann vergessen es ordentlich zu machen. Nun ist aufgeräumt.

Das eigentliche Problem konnte ich dank Eurer Anregungen lösen. Danke!
Ich werde das hier noch in ordentlicher Form präsentieren, für interessierte Mitleser.
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

Ich präsentiere hier nur die wichtigsten Codezeilen.

Zusatz Window, das Objekt des Signals festlegen

Code: Alles auswählen

class SettingsWindow(QWidget):

    got_signal = pyqtSignal(str)
Bei der gewünschten Aktion, das Signal auslösen

Code: Alles auswählen

self.got_signal.emit("SIGNAL")
Main Window

Man legt hier die Verbindung zu dem Signal fest und definiert, welche Funktion dann ausgelöst werden soll.

Code: Alles auswählen

if __name__ == "__main__":

    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    w2 = SettingsWindow()
    w2.got_signal.connect(mainWin.show_it)
    app.exec()
Ja, w2 ist kein schöner Name, wird noch umgebaut.

Die Funktion

Code: Alles auswählen

def show_it(self, the_signal):
	print(the_signal)
Ich hoffe das hält alles dem prüfenden Blick der Profis stand, wenn nicht bitte korrigieren. Ich lerne gerne.

Ein Beispiel, von dem ich Teile entnommen habe, hat mir unheimlich dabei geholfen das Grundprinzip zu verstehen. Ich hoffe das Posten des Links ist in Ordnung, wenn nicht bitte entfernen.
https://stackoverflow.com/questions/592 ... to-another
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

"got_signal" ist ein schlechter Name für ein Signal. "show_it" lässt vermuten, dass ein Fenster angezeigt wird, weil man das mit .show() tut. Das ist aber nicht Ziel dieses Signals, oder?
Du musst dringend an deiner Benennung arbeiten. Nicht "irgendwann später" sondern dir das erst gar nicht falsch angewöhnen.

Du legst lauter globale Variablen an. Das solltest du keinesfalls tun.
Verschiebe dafür deinen Programmeinstieg in eine Funktion "main":

Code: Alles auswählen

def main():
    app = QApplication(sys.argv)
    mainWin = MainWindow()
    mainWin.show()
    w2 = SettingsWindow()
    w2.got_signal.connect(mainWin.show_it)
    app.exec()

if __name__ == "__main__":
    main()
Etwas funktioniert dann nicht mehr? Dann hast du auf globalen Variablen gearbeitet. Das ist ein No-Go.

Ich würde SettingsWindow nicht "vorsorglich" instanzieren, sondern dann, wenn es gebraucht wird.
Sprich: Aus diesem Abschnitt raus und dort wo du settings_window.show() (ich war mal so frei, das für dich vernünftig zu benennen) aufrufst, wird settings_window auch instanziert und ein Signal connected.
FrankM
User
Beiträge: 26
Registriert: Dienstag 20. Juli 2021, 08:51

@sparrow: Danke für die Anregungen. Da habe ich wohl noch viel Arbeit vor mir.

SettingsWindow instanziere ich jetzt, wenn es benötigt wird.
Etwas funktioniert dann nicht mehr? Dann hast du auf globalen Variablen gearbeitet. Das ist ein No-Go.
OK, das macht mir dann jetzt einen Haufen Arbeit.
Benutzeravatar
__blackjack__
User
Beiträge: 13075
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ein besserer Name für `got_signal` wäre in diesem Fall beispielsweise `settings_changed` wenn das Signal ausgelöst werden soll wenn sich die Einstellungen geändert haben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten