HOWTO · Tkinter
Como Passar Argumentos ao Comando do Botão Tkinter
Como passar argumentos para o comando do botão Tkinter
Nesta página
A opção command de um botão Tkinter espera um objeto chamável. Para passar argumentos, associe-os agora e deixe o Tkinter chamar esse objeto quando o usuário clicar. Escrever command=show_message("Saved") chama a função enquanto o botão está sendo criado; use partial ou uma função envolvente com lambda para adiar a chamada.
Passar argumentos com functools.partial
Use functools.partial para associar argumentos a uma função existente. Ela retorna um objeto chamável com esses valores associados, que pode ser atribuído diretamente à opção command de um botão. Esta simulação sem interface gráfica representa o espaço command de um botão para mostrar o comportamento da chamada de retorno sem abrir uma janela. Execute este exemplo:
from functools import partial
def show_message(message):
print(message)
class Button:
def __init__(self, command):
self.command = command
def click(self):
self.command()
save_button = Button(command=partial(show_message, "Saved"))
remove_button = Button(command=partial(show_message, "Removed"))
save_button.click()
remove_button.click()
Saved
Removed
Cada clique simulado chama o objeto chamável armazenado e imprime a mensagem associada. Para abrir uma janela de verdade, execute este script completo com Tkinter e clique em qualquer um dos botões; o rótulo exibe a mensagem e a categoria correspondentes. O texto visível dos botões e do rótulo permanece em inglês, porque os blocos de código e de saída são preservados sem alterações:
from functools import partial
def show_message(message, category):
result.config(text=f"{message} ({category})")
try:
import tkinter as tk
except ImportError as error:
print(f"Tkinter is unavailable: {error}")
else:
try:
root = tk.Tk()
except tk.TclError as error:
print(f"A graphical display is required to open the Tkinter window: {error}")
else:
root.title("Button callbacks with partial")
result = tk.Label(root, text="Choose an action")
result.pack(padx=12, pady=8)
tk.Button(
root,
text="Save profile",
command=partial(show_message, "Saved", "profile"),
).pack(padx=12, pady=4)
tk.Button(
root,
text="Remove draft",
command=partial(show_message, "Removed", "draft"),
).pack(padx=12, pady=4)
root.mainloop()
A chamada de retorno aceita message e category, correspondendo aos dois valores associados em cada chamada de partial. partial é útil quando a função de destino já tem a assinatura adequada e você quer deixar visível a associação de um ou mais valores na atribuição de command.
Passar argumentos com uma função lambda
Uma função lambda pode envolver uma chamada e fornecer os argumentos quando o Tkinter a invocar. A expressão lambda: show_message("Saved") cria um objeto chamável sem argumentos; a chamada da função dentro do corpo só acontece depois, quando há um clique. Para uma função lambda com parâmetros, a sintaxe é lambda parameters: expression.
Esta simulação sem interface gráfica armazena cada função lambda em um espaço command semelhante ao de um botão e a invoca para representar um clique. Execute este exemplo:
def greet(name):
print(f"Hello, {name}!")
class Button:
def __init__(self, command):
self.command = command
def click(self):
self.command()
ada_button = Button(command=lambda: greet("Ada"))
sam_button = Button(command=lambda: greet("Sam"))
ada_button.click()
sam_button.click()
Hello, Ada!
Hello, Sam!
Cada clique simulado invoca a função lambda armazenada e imprime a saudação selecionada. Para abrir uma janela de verdade, execute este script completo com Tkinter e clique em qualquer um dos botões; o rótulo muda para a saudação selecionada:
def greet(name):
result.config(text=f"Hello, {name}!")
try:
import tkinter as tk
except ImportError as error:
print(f"Tkinter is unavailable: {error}")
else:
try:
root = tk.Tk()
except tk.TclError as error:
print(f"A graphical display is required to open the Tkinter window: {error}")
else:
root.title("Button callbacks with lambda")
result = tk.Label(root, text="Choose a greeting")
result.pack(padx=12, pady=8)
tk.Button(
root,
text="Greet Ada",
command=lambda: greet("Ada"),
).pack(padx=12, pady=4)
tk.Button(
root,
text="Greet Sam",
command=lambda: greet("Sam"),
).pack(padx=12, pady=4)
root.mainloop()
Escolha partial quando quiser associar valores a uma função existente e deixar essa associação visível na atribuição de command. Escolha uma função lambda quando a chamada precisar de um pequeno ajuste em linha ou quando quiser explicitar a expressão da chamada de retorno junto ao botão. Uma função lambda também pode passar vários argumentos, como em lambda: show_message("Saved", "profile"); defina a função de destino para aceitar esses valores. Em ambos os casos, atribua o próprio objeto chamável a command. Acrescentar parênteses à chamada de retorno durante a configuração do botão executa a função imediatamente, antes que alguém possa clicar. Se o botão parecer não fazer nada, confira se o nome da chamada de retorno está correto, se os argumentos correspondem à assinatura da função e se o corpo da função produz algum efeito observável, como imprimir algo ou atualizar um widget.