在OptionMenu Tkinter中选择选项后如何将按钮状态从禁用更改为活动

问题描述

我正在尝试在选项菜单中选择一个选项时更改按钮状态,但是没有任何变化。谁能告诉我我在做什么错?

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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...