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 btn
appuyez dessus, il appelle sa propre fonction, ce qui est très similaire à celui button_press_handle
de 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 command
option doit être définie comme la référence à la méthode que nous voulons appeler, similaire à callback
dans 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 print
mé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, print
donc 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 print
mé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 lambda
dé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 lambda
instruction, 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 callback
cela ne peut pas vraiment return
parce qu'il est uniquement appelé à l'intérieur button_press_handle
avec callback()
par opposition à return callback()
. Cela fonctionne, return
mais 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 btn
le 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