Python code erst nach Klick eines Buttons auführen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Ja, der Code in der Funktion Attribut1 wird nur ausgeführt, wenn der Button sein clicked-Signal auslöst oder wenn die Funktion separat irgendwo aufgerufen wird.

Nun würde ich zunächst einmal hinterfragen, wie du geprüft hast, dass dies so nicht pasiert. Rufst du die Funktion überhaupt noch woanders auf? Als Nebenfrage: Wieso hast du eine Rückgabe für die Funktion definiert?

Was ich auch etwas verwirrend finde, ist, dass du so oft den Namen Attribut... vergeben hast, es gibt neben der Methode sogar eine globale Variable Attribut1. Eindeutigere Namen würden sich doch sicherlich finden lassen?

Und wofür ist der tkinter-Import, wenn du mit Qt doch schon ein GUI-Toolkit eingebunden hast?

redsky 
Fragesteller
 31.12.2020, 12:16

Hallo regex,

ich arbeite mit PyCharm und habe hinter Attribut1 = ui.Attribut1() ein print(Attribut1) gesetzt und festgestellt, dass dieser geprinted wird bevor ich den Button klicke. Habe den print Befehl in der Frage ergänzt.

Ich habe mir das mal so gelernt, dass ich eine Funktion immer mit einem return beende, wenn ich am Ende einen Wert haben möchte. Das habe ich aus dem Java Einstiegskurs. Ist es in meinem Fall unschön oder gar falsch?

Das mit dem Attribut und Attribut1 muss ich mal ändern ja.

PyCharm hat sich bei nem frühreren Stadium des Skripts beschwert, dass tkinter nicht eingebunden ist. Aber du hast recht, er läuft jetzt auch ohne.

Ja ich weiß es ist chaotisch, aber ich arbeite daran es übersichtlicher zu machen.

Danke für die Anmerkungen :)

0
regex9  31.12.2020, 14:20
@redsky
(...) und festgestellt, dass dieser geprinted wird bevor ich den Button klicke (...)

Wenn du eine Methode explizit aufrufst, was du ja da auch tust:

Attribut1 = ui.Attribut1()

wird ihr Körper auch ausgeführt. Mit der Bindung an das Signal (clicked) hat das also soweit nichts zu tun. Wenn du die Zeile entfernst, wird die Methode (sofern du nicht noch weitere explizite Aufrufe tätigst), frühestens bei Buttonklick aufgerufen.

Wenn du die Methode weiter so aufrufen möchtest, wie bisher, brauchst du einen Rückgabewert. Methoden, die allerdings nur als Slot verwendet werden, sind normalerweise ohne Rückgabe (denn die wird ja für diese Fälle nicht benötigt).

0
redsky 
Fragesteller
 31.12.2020, 16:45
@regex9

jaaa ich verstehe. Das Programm lädt sich den Default Text der in der Combo Box auftaucht in Attribut1 und printed den dann.

Ich würde aber eigentlich gerne die Methode weiter so aufrufen. Was kann ich machen, dass er die Methode erst dann aufruft, nachdem ich den Button betätigt habe?

Also eigentlich müsste ich nach

Dialog.show()

eine Art wartebefehl einbauen, sowas wie

sys.wait()

und dann in der setup.UI Funktion einen Befehl, dass er jetzt den Code weiter ausführen soll.

self.Button.clicked.connect(sys.continue())

Wahrscheinlich muss ich mich nochmal in Threading oder sowas einlesen (müsste sowieso mal gemacht werden) aber die Codebeispiele im Internet sehen auf den ersten Blick sehr umfangreich aus. Kann man das nicht auch mit 2-3 Zeilen machen, dass Python wartet bis der Nutzer den Button betätigt hat?

Vielen Dank schonmal für die Tipps. Das hat mich schon weiter gebracht

0
regex9  31.12.2020, 23:26
@redsky

Wieso du die Methode aufrufen möchtest, wenn sie dann doch nicht ausgeführt werden soll, kann ich nicht nachvollziehen. Entweder du überlässt das den Nutzer (das halte ich für am sinnvollstern) oder führst die Methode selbst aus, ohne auf einen Buttonklick zu warten (und sei es erst nach einer gewissen Wartezeit, dafür lässt sich ein QTimer einsetzen). Also überdenke besser nochmal, was du genau möchtest und was wirklich sinnvoll ist.

Irgendwelche Warteaktionen auf Buttonklicks in extra Threads sind es nicht (sie verschleudern nur Ressourcen, Aufwand und bilden neben schlechtem Design neue potenzielle Fehlerquellen). Führe Aktionen, die erst nach Buttonklick getätigt werden sollen, in den Slots aus. Vermutlich musst du dein Programm etwas umstrukturieren.

1
redsky 
Fragesteller
 01.01.2021, 14:00
@regex9

Manchmal helfen auch ein paar Gläser Sekt. Habs mir nochmal angeschaut und erfolgreich umgestellt

0