GUI de exemplo:
Digamos que eu tenho a GUI:
import tkinter as tk
root = tk.Tk()
btn = tk.Button(root, text="Press")
btn.pack()
root.mainloop()
O que acontece quando um botão é pressionado
Veja que quando btn
pressionado, ele chama sua própria função, que é muito semelhante ao button_press_handle
exemplo a seguir:
def button_press_handle(callback=None):
if callback:
callback() # Where exactly the method assigned to btn['command'] is being callled
com:
button_press_handle(btn['command'])
Você pode simplesmente pensar que command
opção deve ser definida como, a referência ao método que queremos ser chamado, semelhante a callback
in button_press_handle
.
Chamando um método ( retorno de ) quando o botão é pressionado
Sem argumentos
Então, se eu quisesse print
algo quando o botão for pressionado, seria necessário definir:
btn['command'] = print # default to print is new line
Preste muita atenção para a falta de ()
com o print
método que é omitido no sentido de que: "Este é o nome do método que eu quero que você chame quando pressionado , mas . Não chamá-lo apenas neste instante"No entanto, eu não passei nenhum argumento para print
que ele imprimisse o que imprimir quando chamado sem argumentos.
Com argumento (s)
Agora, se eu também quisesse passar argumentos para o método que gostaria de ser chamado quando o botão for pressionado, poderia usar as funções anônimas, que podem ser criadas com a instrução lambda , neste caso para o print
método interno, como o seguinte :
btn['command'] = lambda arg1="Hello", arg2=" ", arg3="World!" : print(arg1 + arg2 + arg3)
Chamando vários métodos quando o botão é pressionado
Sem argumentos
Você também pode conseguir isso usando a lambda
declaração, mas é considerada uma prática ruim e, portanto, não a incluirei aqui. A boa prática é definir um método separado multiple_methods
, que chame os métodos desejados e, em seguida, defina-o como retorno de chamada ao pressionar o botão:
def multiple_methods():
print("Vicariously") # the first inner callback
print("I") # another inner callback
Com argumento (s)
Para passar argumentos para métodos que chamam outros métodos, use novamente a lambda
instrução, mas primeiro:
def multiple_methods(*args, **kwargs):
print(args[0]) # the first inner callback
print(kwargs['opt1']) # another inner callback
e defina:
btn['command'] = lambda arg="live", kw="as the" : a_new_method(arg, opt1=kw)
Retornando Objeto (s) do retorno de chamada
Além disso, observe que isso callback
não pode realmente return
porque é chamado apenas por dentro button_press_handle
e callback()
não por return callback()
. Faz, return
mas não em qualquer lugar fora dessa função. Portanto, você deve modificar os objetos acessíveis no escopo atual.
Exemplo completo com modificações globais de objetos
O exemplo abaixo chamará um método que altera btn
o texto de cada vez que o botão é pressionado:
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()
Espelho