Heim >Backend-Entwicklung >Python-Tutorial >Wie vermeide ich unerwartetes Verhalten beim Binden von Befehlen an Schaltflächen, die in einer Tkinter-Schleife erstellt wurden?

Wie vermeide ich unerwartetes Verhalten beim Binden von Befehlen an Schaltflächen, die in einer Tkinter-Schleife erstellt wurden?

Linda Hamilton
Linda HamiltonOriginal
2024-12-20 00:51:11360Durchsuche

How to Avoid Unexpected Behavior When Binding Commands to Buttons Created in a Tkinter Loop?

Tkinter-Schleifenschaltflächenerstellung mit Befehlsargumentbindung

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.

Lösung: Verwendung von Abschlüssen

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn