Exemple GUI :
Supposons que j'ai l'interface graphique (GUI) :
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Appuyez")
btn.pack()
root.mainloop()
Ce Qui Se Passe Quand un Bouton Est Pressé
Remarquez que lorsque le btn
est pressé, il appelle sa propre fonction qui est très similaire à button_press_handle
dans l'exemple suivant :
def button_press_handle(callback=None):
if callback:
callback() # Où exactement la méthode assignée à btn['command'] est appelée
avec :
button_press_handle(btn['command'])
Vous pouvez simplement penser que l'option command
devrait être définie comme une référence à la méthode que nous voulons appeler, similaire à callback
dans button_press_handle
.
Appel d'une Méthode (un Callback) Lorsque le Bouton Est Pressé
Sans arguments
Donc si je voulais print
quelque chose lorsque le bouton est pressé, je devrais définir :
btn['command'] = print # par défaut, print est une nouvelle ligne
Prêtez attention au manque de ()
avec la méthode print
qui est omis dans le sens que : "C'est le nom de la méthode que je veux que vous appeliez lorsque vous appuyez mais ne l'appelez pas juste à cet instant précis." Cependant, je n'ai pas passé d'arguments pour print
donc elle a imprimé ce qu'elle imprime lorsqu'elle est appelée sans arguments.
Avec Argument(s)
Maintenant, si je voulais également passer des arguments à la méthode que je veux appeler lorsque le bouton est pressé, je pourrais utiliser les fonctions anonymes, qui peuvent être créées avec l'instruction lambda, dans ce cas pour la méthode intégrée print
, comme suit :
btn['command'] = lambda arg1="Bonjour", arg2=" ", arg3="Monde !" : print(arg1 + arg2 + arg3)
Appel de Multiples Méthodes Lorsque le Bouton Est Pressé
Sans Arguments
Vous pouvez également y parvenir en utilisant l'instruction lambda
mais cela est considéré comme une mauvaise pratique et donc je ne l'inclurai pas ici. La bonne pratique est de définir une méthode séparée, multiple_methods
, qui appelle les méthodes souhaitées et ensuite la définir comme rappel pour l'appui sur le bouton :
def multiple_methods():
print("Vicariement") # le premier rappel interne
print("Je") # un autre rappel interne
Avec Argument(s)
Pour passer des argument(s) à la méthode qui appelle d'autres méthodes, utilisez à nouveau l'instruction lambda
, mais d'abord :
def multiple_methods(*args, **kwargs):
print(args[0]) # le premier rappel interne
print(kwargs['opt1']) # un autre rappel interne
et ensuite définissez :
btn['command'] = lambda arg="vivre", kw="comme le" : une_nouvelle_methode(arg, opt1=kw)
Retour d'Objet(s) Depuis le Callback
Notez également que le callback
ne peut pas vraiment return
car il n'est appelé que à l'intérieur de button_press_handle
avec callback()
par opposition à return callback()
. Il return
mais pas à l'extérieur de cette fonction. Ainsi, vous devriez plutôt modifier les objets accessibles dans la portée actuelle.
Exemple Complet avec Modification(s) d'Objets globaux
L'exemple ci-dessous appellera une méthode qui changera le texte de btn
à chaque fois que le bouton est pressé :
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn peut être omis mais pas sûr s'il doit l'être
txt = ("Vicariement", "Je", "vis", "comme", "le", "monde", "entier", "meurt")
btn['text'] = txt[i] # l'objet global qui est modifié
i = (i + 1) % len(txt) # un autre objet global qui est modifié
root = tk.Tk()
btn = tk.Button(root, text="Mon Bouton")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
Mirroir
11 votes
@Mike-SMT C'est exactement pour cela que je veux récompenser les gens qui publient de bonnes réponses à des questions courantes - surtout si les questions sont faciles. Beaucoup de personnes publient des réponses bâclées et peu motivées à des questions faciles. Je veux que les gens réalisent qu'il n'est pas nécessaire d'être un expert en programmation pour rédiger des réponses exceptionnelles.