Des options telles que le widget Button dans Tkinter: je vais vous montrer comment passer des arguments à communad.
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"bouton{i}", command=self.show_message(i)).pack()
def show_message(self, index):
def inner():
print(f"bouton{index}A été cliqué")
return inner
def main():
root = tk.Tk()
app = Application(master=root)
app.mainloop()
if __name__ == "__main__":
main()
Quand j'essaye de l'écrire normalement, j'ai tendance à l'écrire comme suit:
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"bouton{i}", command=self.show_message(i)).pack()
def show_message(self, index):
print(f"bouton{index}A été cliqué")
def main():
root = tk.Tk()
app = Application(master=root)
app.mainloop()
if __name__ == "__main__":
main()
Malheureusement, cela ne fonctionne pas comme prévu.
Comme vous pouvez le voir en le déplaçant, self.show_message (i)
est exécuté lorsque le bouton est généré, et tous les boutons {index} sont cliqués
sont imprimés. Et lorsque le bouton important est cliqué, aucune action n'est entreprise. Ceci est lié au comportement de l'option de commande comme suit.
self.show_message (i)
est exécutéself.show_message (i) ()
est exécutéEn raison des spécifications gênantes décrites ci-dessus, une certaine ingéniosité est requise lors de la définition de la fonction de rappel. La partie nécessaire du code (dans ce cas, print (f" bouton {index} a été cliqué ")
) n'est pas exécutée par self.show_message (i)
, et self n'est pas exécuté. Vous devez l'exécuter avec .show_message (i) ()
.
Pour ce faire, utilisez ** Inner Function **. C'est facile à comprendre si vous pensez que c'est comme suit.
def show_message(index):
def inner():
print(f"bouton{index}A été cliqué")
return inner
command = show_message(1)
command()
La fonction interne (fonction interne) est définie dans la fonction show_message et elle est renvoyée. En d'autres termes, la fonction interne est incluse dans la «commande» sur la deuxième ligne à partir du bas. Cependant, comme le contenu de la fonction interne n'a pas été exécuté, il ne sera pas imprimé. Et sur la dernière ligne, nous exécutons la fonction interne.
En d'autres termes, show_message (1)
ne semble rien faire, mais show_message (1) ()
vous permet de faire ce que vous voulez.
--python tkinter Comment déterminer quel bouton a été enfoncé --memopy http://memopy.hatenadiary.jp/entry/2017/06/11/220452 --Lors du passage d'arguments avec l'option de commande de Tkinter, cela fonctionne comme prévu pour définir l'imbrication dans la fonction https://qiita.com/yukid/items/a0140b5c1a3e28f636f0
Recommended Posts