Esempio di GUI:
Diciamo che ho la GUI:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
Cosa succede quando si preme un pulsante
Vedi che quando btnviene premuto chiama la sua stessa funzione che è molto simile al button_press_handleseguente esempio:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
con:
button_press_handle(btn['command'])
Puoi semplicemente pensare che l' commandopzione dovrebbe essere impostata come, il riferimento al metodo che vogliamo essere chiamato, simile a callbackin button_press_handle.
Richiamo di un metodo ( richiamata ) quando si preme il pulsante
Senza argomenti
Quindi, se volessi printqualcosa quando si preme il pulsante, avrei bisogno di impostare:
btn['command'] = print # default to print is new line
Prestare particolare attenzione alla mancanza di ()con il printmetodo che viene omesso nel senso che: "Questo è il nome del metodo che io voglio che chiami quando viene premuto , ma . Non chiamatelo solo questo istante" Tuttavia, non ho passato alcun argomento per il motivo per printcui ha stampato tutto ciò che stampa quando chiamato senza argomenti.
Con Argomento (i)
Ora, se volessi passare anche argomenti al metodo che voglio essere chiamato quando si preme il pulsante, potrei usare le funzioni anonime, che possono essere create con l' istruzione lambda , in questo caso per il printmetodo incorporato, come il seguente :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Chiamata a più metodi quando si preme il pulsante
Senza argomenti
Puoi anche ottenere questa lambdaaffermazione usando ma è considerata una cattiva pratica e quindi non la includerò qui. La buona pratica è definire un metodo separato multiple_methods, che chiama i metodi desiderati e quindi impostarlo come callback al pulsante premere:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
Con Argomento (i)
Per passare l'argomento / i al metodo che chiama altri metodi, usa nuovamente l' lambdaaffermazione, ma prima:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
e quindi impostare:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Restituzione di oggetti dal callback
Inoltre un'ulteriore nota che callbacknon si può davvero returnperché è chiamato solo all'interno button_press_handlecon callback()in contrasto return callback(). Lo fa returnma non al di fuori di quella funzione. Pertanto, è preferibile modificare gli oggetti che sono accessibili nell'ambito corrente.
Esempio completo con modifiche globali agli oggetti
L'esempio seguente chiamerà un metodo che cambia btnil testo ogni volta che si preme il pulsante:
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()
Specchio