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
Freigeben: 2024-12-20 00:51:11
Original
390 Leute haben es durchsucht

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage