【问题标题】:How to change a buttons state from disabled to active when an option is selected in an OptionMenu Tkinter在 OptionMenu Tkinter 中选择选项时如何将按钮状态从禁用更改为活动
【发布时间】:2020-09-25 10:45:44
【问题描述】:

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

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()

【问题讨论】:

  • 我已经添加了答案让我知道
  • 谢谢你的帮助。我只是在我发帖后才看到这个,我想通了。再次感谢!

标签: python python-3.x tkinter tkinter.optionmenu


【解决方案1】:

把你的函数改成这样:

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

希望这能清除错误,如果有任何疑问,请告诉我。

干杯

【讨论】:

    【解决方案2】:

    您可以在OptionMenu(...) 中添加command=changeState 以在options 更改时调用changeState()

    def changeState(pick):
        if pick == "op2":
            button['state'] = ACTIVE
            button.config(text = "ACTIVE")
        else:
            button['state'] = DISABLED
            button.config(text = "Disabled")
    
    ...
    
    options = OptionMenu(app, choose, "op1", "op2", command=changeState)
    

    【讨论】:

    • 嗯,optionmenu 的命令接受 tkinter 变量的参数对吧?所以这会产生错误。您可能想使用 lambda
    • @CoolCloud 你试过了吗?回调将传递所选项目。
    • 实际上我做了并得到了错误 - 检查here
    • @CoolCloud 我的changeState()版本有参数,所以和你说的lambda _一样。所以我不知道你为什么建议使用 lambda。
    • 哦,我注意到这个参数,是的,你的正确。
    【解决方案3】:

    知道了!

    编辑:我稍微修改了第 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()
    

    【讨论】:

    • 这里不鼓励仅使用代码的答案。请edit 它并说出您为解决问题所做的工作。
    • 这是对您自己问题的纯代码答案,但您已经说出了您“得到”的内容或与您问题中的代码有什么不同 - 所以它对其他人的启发性较低。
    猜你喜欢
    • 1970-01-01
    • 2013-04-09
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    相关资源
    最近更新 更多