Exemple d'interface graphique:
Disons que j'ai l'interface graphique:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
Que se passe-t-il lorsqu'un bouton est enfoncé
Voyez que lorsque vous btnappuyez dessus, il appelle sa propre fonction, ce qui est très similaire à celui button_press_handlede l'exemple suivant:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
avec:
button_press_handle(btn['command'])
Vous pouvez simplement penser que cette commandoption doit être définie comme la référence à la méthode que nous voulons appeler, similaire à callbackdans button_press_handle.
Appel d'une méthode ( rappel ) lorsque le bouton est enfoncé
Sans arguments
Alors si je voulais print quelque chose lorsque le bouton est enfoncé, j'aurais besoin de définir:
btn['command'] = print # default to print is new line
Faites très attention à l' absence de ()avec la printméthode qui est omise dans le sens que: "C'est le nom de la méthode que je veux que vous appeliez lorsque vous appuyez dessus, mais ne l'appelez pas juste à l'instant même."Cependant, je n'ai pas passé d'arguments pour le, printdonc il a imprimé tout ce qu'il imprime lorsqu'il est appelé sans arguments.
Avec argument (s)
Maintenant, si je voulais également passer des arguments à la méthode que je veux être appelée lorsque le bouton est enfoncé, je pourrais utiliser les fonctions anonymes, qui peuvent être créées avec une instruction lambda , dans ce cas pour la printméthode intégrée, comme suit :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Appel de plusieurs méthodes lorsque vous appuyez sur le bouton
Sans pour autant arguments
Vous pouvez également y parvenir en utilisant une lambdadéclaration, mais c'est considéré comme une mauvaise pratique et je ne l'inclurai donc pas ici. La bonne pratique consiste à définir une méthode distincte multiple_methods, qui appelle les méthodes souhaitées, puis à la définir comme rappel de la pression du bouton:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
Avec argument (s)
Afin de passer des arguments à la méthode qui appelle d'autres méthodes, utilisez à nouveau lambdainstruction, mais d'abord:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
puis définissez:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Retour des objets à partir du rappel
Notez également que callbackcela ne peut pas vraiment returnparce qu'il est uniquement appelé à l'intérieur button_press_handleavec callback()par opposition à return callback(). Cela fonctionne, returnmais pas n'importe où en dehors 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 change btnle texte de chaque fois que vous appuyez sur le bouton:
import tkinter as tk
i = 0
def text_mod():
global i, btn # btn can be omitted but not sure if should be
txt = ("Vicariously", "I", "live", "as", "the", "whole", "world", "dies")
btn['text'] = txt[i] # the global object that is modified
i = (i + 1) % len(txt) # another global object that gets modified
root = tk.Tk()
btn = tk.Button(root, text="My Button")
btn['command'] = text_mod
btn.pack(fill='both', expand=True)
root.mainloop()
Miroir