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 btnpressionado, ele chama sua própria função, que é muito semelhante ao button_press_handleexemplo 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 callbackin 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 printmé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 printque 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 printmé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 lambdadeclaraçã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 lambdainstruçã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 callbacknão pode realmente returnporque é chamado apenas por dentro button_press_handlee callback()não por return callback(). Faz, returnmas 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 btno 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