Heim >Backend-Entwicklung >Python-Tutorial >Wie vermeide ich unerwartetes Verhalten beim Binden von Befehlen an Schaltflächen, die in einer Tkinter-Schleife erstellt wurden?
In Tkinter kann die Erstellung von Schaltflächen innerhalb einer for-Schleife eine Herausforderung darstellen, wenn versucht wird, den Befehl jeder Schaltfläche mit einem eindeutigen Argument zu binden.
Stellen Sie sich das folgende Szenario vor:
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W) def open_this(self, myNum): print(myNum)
Beim Ausführen dieses Codes kann es vorkommen, dass ein Seltsames Verhalten, bei dem beim Drücken einer beliebigen Taste immer derselbe Wert gedruckt wird, normalerweise der letzte Iterationswert. Dies liegt daran, dass jede innerhalb der Schleife erstellte Lambda-Funktion auf dieselbe Variable i verweist, die in jeder Schleifeniteration aktualisiert wird.
Um dieses Problem zu beheben, können Sie die Abschlüsse von Python nutzen durch Zuweisen von i zu einer neuen Variablen innerhalb der Lambda-Funktion, wodurch effektiv ein eindeutiger Bereich für jede Schaltfläche erstellt wird. Hier ist der geänderte Code:
def createGameURLs(self): self.button = [] for i in range(3): self.button.append(Button(self, text='Game '+str(i+1), command=lambda i=i: self.open_this(i))) self.button[i].grid(column=4, row=i+1, sticky=W) def open_this(self, myNum): print(myNum)
Durch die Einbindung von Abschlüssen erfasst jede Lambda-Funktion den aktuellen i-Wert zum Zeitpunkt der Definition und stellt so das korrekte Tastenverhalten sicher.
Das obige ist der detaillierte Inhalt vonWie vermeide ich unerwartetes Verhalten beim Binden von Befehlen an Schaltflächen, die in einer Tkinter-Schleife erstellt wurden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!