Da sind eine ganze Reihe von Denkfehlern drin.
Es faengt damit an, dass man True und Fall nicht mit "is" vergleicht. Das ist ein Test auf Objektidentitaet, und eine Zahl oder ein Boolscher Wert hat nicht garantiert die gleiche Identitaet. Das funktioniert, weil der Python Intepreter eine Reihe von kleinen Zahlen "cached", aber darauf sollte man sich nicht verlassen.
Dann vergleicht man auch nicht mit der literalen boolschen Werten. Denn das Ergebnis ist ja auch wieder ein booolscher Wert. Warum sollte man dann aufhoeren?
Stattdessen fragt man einfach ab, ob change ist, oder nicht:
Dann ist change eine globale Variable. Immer eine ganz schlechte Idee. Man benutzt keine globalen Variablen. Wenn man in GUIs Zustand hat, dann wird es Zeit fuer objektorientierte Programmierung.
Man ruft eine Funktion so auf:
Dann wird die sofort ausgefuehrt. So wie zB
Und du rufst
auf. Das wird also *sofort* ausgefuehrt.
Du musst die aber nicht aufrufen, sondern ein callback uebergeben. Also etwas aufrufbares, das *dann* aufgerufen wird, wenn der Button betaetigt wird.
Die Nutzung von place ist auch grosser Mist, weil das auf fast jedem Computer anders aussieht. Vor allem aber das dann auch noch zu mischen mit pack geht vollends in die Hose.
Und UI-Element dynamisch anzulegen (ausser in groeseren Einheiten, wie zB einem Dialog oder so), ist auch so gut wie nie eine gute Idee.
Das Programm ist ja ziemlich wertfrei, darum ist es auch nicht so richtig sinnvoll zu reparieren. Etwas, das eine gewisse Aehnlichkeit hat:
Code: Alles auswählen
import tkinter
class App:
def __init__(self, root):
btntest = tkinter.Button(root, text="Hello", command=self._toggle) # <---- hier KEINE KLAMMERN! Das darf KEIN Aufruf sein!
btntest.pack()
self._change = False
def _toggle(self):
self._change = not self._change
print(self._change)
def main():
root = tkinter.Tk()
root.title("Das erste GUI Programm")
app = App(root)
root.mainloop()
if __name__ == '__main__':
main()