Optionen wie das Button-Widget in Tkinter: Ich werde Ihnen zeigen, wie Sie Argumente an communad übergeben.
import tkinter as tk
import tkinter.ttk as ttk
class Application(ttk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.master.title("Title")
self.master.geometry("400x300")
self.create_widgets()
def create_widgets(self):
for i in range(1, 11):
ttk.Button(self, text=f"Taste{i}", command=self.show_message(i)).pack()
def show_message(self, index):
def inner():
print(f"Taste{index}Wurde angeklickt")
return inner
def main():
root = tk.Tk()
app = Application(master=root)
app.mainloop()
if __name__ == "__main__":
main()
Wenn ich versuche, es normal zu schreiben, neige ich dazu, es wie folgt zu schreiben:
import tkinter as tk
import tkinter.ttk as ttk
class Application(ttk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.pack()
self.master.title("Title")
self.master.geometry("400x300")
self.create_widgets()
def create_widgets(self):
for i in range(1, 11):
ttk.Button(self, text=f"Taste{i}", command=self.show_message(i)).pack()
def show_message(self, index):
print(f"Taste{index}Wurde angeklickt")
def main():
root = tk.Tk()
app = Application(master=root)
app.mainloop()
if __name__ == "__main__":
main()
Leider funktioniert dies nicht wie erwartet.
Wie Sie durch Verschieben sehen können, wird "self.show_message (i)" ausgeführt, wenn die Schaltfläche generiert wird, und alle "Schaltflächen {Index} werden angeklickt" werden gedruckt. Wenn Sie auf die wichtige Schaltfläche klicken, wird keine Aktion ausgeführt. Dies hängt wie folgt mit dem Verhalten der Befehlsoption zusammen.
self.show_message (i)
wird ausgeführtself.show_message (i) ()
wird ausgeführtAufgrund der oben beschriebenen problematischen Spezifikationen ist bei der Definition der Rückruffunktion ein gewisser Einfallsreichtum erforderlich. Der erforderliche Teil des Codes (in diesem Fall "print (f" button {index} wurde angeklickt ")") wird von "self.show_message (i)" nicht ausgeführt, und "self" wird nicht ausgeführt. Sie müssen es mit .show_message (i) () `ausführen.
Verwenden Sie dazu ** Innere Funktion **. Es ist leicht zu verstehen, wenn Sie denken, dass es wie folgt ist.
def show_message(index):
def inner():
print(f"Taste{index}Wurde angeklickt")
return inner
command = show_message(1)
command()
Die innere Funktion (interne Funktion) wird in der Funktion show_message definiert und zurückgegeben. Mit anderen Worten, die innere Funktion ist im Befehl in der zweiten Zeile von unten enthalten. Da der Inhalt der inneren Funktion jedoch nicht ausgeführt wurde, wird er nicht gedruckt. Und in der letzten Zeile wird die innere Funktion ausgeführt.
Mit anderen Worten, "show_message (1)" scheint nichts zu tun, aber "show_message (1) ()" ermöglicht es Ihnen, das zu tun, was Sie wollen.
--python tkinter So bestimmen Sie, welche Taste gedrückt wurde --memopy http://memopy.hatenadiary.jp/entry/2017/06/11/220452
Recommended Posts