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 btn
viene premuto chiama la sua stessa funzione che è molto simile al button_press_handle
seguente 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' command
opzione dovrebbe essere impostata come, il riferimento al metodo che vogliamo essere chiamato, simile a callback
in button_press_handle
.
Richiamo di un metodo ( richiamata ) quando si preme il pulsante
Senza argomenti
Quindi, se volessi print
qualcosa 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 print
metodo 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 print
cui 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 print
metodo 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 lambda
affermazione 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' lambda
affermazione, 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 callback
non si può davvero return
perché è chiamato solo all'interno button_press_handle
con callback()
in contrasto return callback()
. Lo fa return
ma 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 btn
il 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