Python 在选项菜单Tkinter中选择选项时,如何将按钮状态从禁用更改为激活

Python 在选项菜单Tkinter中选择选项时,如何将按钮状态从禁用更改为激活,python,python-3.x,tkinter,tkinter.optionmenu,Python,Python 3.x,Tkinter,Tkinter.optionmenu,当在选项菜单中选择一个选项时,我试图更改按钮状态,但没有任何更改。谁能告诉我我做错了什么 from tkinter import * def setLabel(): changed.set("Active") def changeState(): pick = choose.get() if (pick == "op2"): button['state'] = button.ACTIVE

当在选项菜单中选择一个选项时,我试图更改按钮状态,但没有任何更改。谁能告诉我我做错了什么

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")
另外,您不需要调用函数,因此要调用它并激活效果,请在optionmenu中添加一个命令参数,如:

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, choose, "op1", "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
,以便在
选项更改时调用
changeState()

def changeState(拾取):
如果拾取==“op2”:
按钮['state']=活动
button.config(text=“ACTIVE”)
其他:
按钮['state']=已禁用
button.config(text=“Disabled”)
...
选项=选项菜单(应用程序,选择“op1”、“op2”,命令=更改状态)

我添加了一个答案,请务必让我知道。谢谢你的帮助。我只是在发完帖子后才看到这个,我已经弄明白了。再次感谢!这里不鼓励只使用代码的答案。请输入并说明您为解决问题所做的操作。这是一个只回答您自己问题的代码,但您已经说出了您“得到”的内容或与问题中的代码的不同之处-因此这会减少对其他人的启发。嗯,optionmenu命令接受tkinter变量的参数,对吗?所以这会产生错误。您可能想使用lambda@CoolCloud你试过了吗?回调将被传递给所选项目。事实上,我这样做了,并得到了错误-Check@CoolCloud我的版本
changeState()
有一个参数,因此它与您所说的
lambda\uu
相同。所以我不知道你为什么建议使用lambda。哦,我没注意到参数,是的,你是正确的。