问题描述
我正在尝试在选项菜单中选择一个选项时更改按钮状态,但是没有任何变化。谁能告诉我我在做什么错?
from tkinter import *
def setLabel():
changed.set("Active")
def changeState():
pick = choose.get()
if (pick == "op2"):
button['state'] = button.ACTIVE
button.config(text = "ACTIVE")
else:
button['state'] = app.disABLED
button.config(text = "disabled")
app = Tk()
app.resizable(40,40)
choose = StringVar()
choose.set("op1")
options = OptionMenu(app,choose,"op1","op2")
options.pack()
button = Button(app,text = "disabled",state = disABLED,command = setLabel)
button.pack()
changed = StringVar()
label = Label(app,textvariable = changed,font = ("helvetica",10))
label.pack()
app.mainloop()
解决方法
将功能更改为此:
def changeState():
pick = choose.get()
if (pick == "op2"):
button['state'] = ACTIVE #means active state
button.config(text = "ACTIVE")
else:
button['state'] = DISABLED #means disabled state
button.config(text = "Disabled")
也不要调用函数,因此要调用它并使效果生效,请在您的选项菜单上添加一个命令参数,例如:
options = OptionMenu(app,choose,"op1","op2",command=lambda _:changeState())
使用lambda _:
是因为optionmenu命令希望传递tkinter变量,以避免这种情况。您也可以为函数使用一个参数,但是如果您在其他地方调用该函数,则必须传递一个参数,或者也可以使用诸如point=None
之类的参数并摆脱lambda
。
希望这可以清除错误,如果有任何疑问,请告诉我。
欢呼
,知道了!
编辑:我稍稍更改了第9行,删除了button.active并替换为NORMAL了。
from tkinter import *
def setLabel():
changed.set("Active")
def changeState(*args):
pick = choose.get()
if (pick == "op2"):
button['state'] = NORMAL
button.config(text = "ACTIVE")
else:
button['state'] = DISABLED
button.config(text = "Disabled")
app = Tk()
app.resizable(40,40)
choose = StringVar()
choose.set("op1")
options = OptionMenu(app,"op2")
choose.trace("w",changeState)
options.pack()
button = Button(app,text = "Disabled",state = DISABLED,command = setLabel)
button.pack()
changed = StringVar()
label = Label(app,textvariable = changed,font = ("helvetica",10))
label.pack()
app.mainloop()
,
只要更改command=changeState
,就可以在OptionMenu(...)
中添加changeState()
来呼叫options
:
def changeState(pick):
if pick == "op2":
button['state'] = ACTIVE
button.config(text = "ACTIVE")
else:
button['state'] = DISABLED
button.config(text = "Disabled")
...
options = OptionMenu(app,command=changeState)