Quero remover o evento de clique do botão quando clico nele, mas esse código não tem efeito. Cada botão popup msgbox repetidamente:
from tkinter import *
from tkinter import messagebox
root = Tk()
root.geometry("500x500+400+200")
def show_btn(b):
messagebox.showinfo(message=f"{b.cget('text')}")
b.config(command=None)
for x in range(3):
btn = Button(root, text=f"{x}")
btn.config(command=lambda b=btn: show_btn(b))
btn.pack()
root.mainloop()
Que tal
para desabilitar o botão.
Também ficará acinzentado.
E depois você pode ativá-lo novamente
Quando você passa
command=None
para o método config do botão quando ele é clicado pela primeira vez, o valor não é aceito pelo tkinter, pois ele só pode aceitar funções como valores paracommand
. Em vez disso, faça:b.config(command=lambda: None)
.Emitir :
Seu loop atual:
passa corretamente cada botão (
b=btn
) parashow_btn
, mas dentro deshow_btn(b)
, você está correndob.config(command=None)
atrás demessagebox.showinfo
, então o primeiro clique mostra o pop-up e desabilita o botão depois.Entretanto, quando você clica novamente, o botão ainda é chamado
show_btn
porquecommand=None
não remove a vinculação imediatamente, e o lambda ainda faz referência à função original.Consertar:
alternativa:
Use
state=DISABLED
em vez dissoSe preferir desabilitar o botão visualmente e funcionalmente, você pode usar: