Как изменить состояние кнопок с отключенного на активное при выборе параметра в 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()

person ImpulsePenny    schedule 25.09.2020    source источник
comment
Я добавил ответ, дайте мне знать   -  person Cool Cloud    schedule 25.09.2020
comment
Ах, спасибо за вашу помощь. Я только что увидел это после того, как написал, что понял это. Спасибо еще раз!   -  person ImpulsePenny    schedule 25.09.2020


Ответы (3)


Измените свою функцию на это:

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.

Надеюсь, это устранило ошибки, дайте мне знать, если есть сомнения.

Ваше здоровье

person Cool Cloud    schedule 25.09.2020

Вы можете добавить 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, choose, "op1", "op2", command=changeState)
person acw1668    schedule 25.09.2020
comment
Хм, команда optionmenu принимает аргумент переменной tkinter, верно? Таким образом, это приведет к ошибке. Возможно, вы захотите использовать лямбда - person Cool Cloud; 25.09.2020
comment
@CoolCloud Ты пробовал? Обратному вызову будет передан выбранный элемент. - person acw1668; 25.09.2020
comment
На самом деле я сделал и получил ошибку - проверьте здесь - person Cool Cloud; 25.09.2020
comment
@CoolCloud В моей версии changeState() есть аргумент, так что это то же самое, что вы сказали lambda _. Поэтому я не знаю, почему вы предлагаете использовать лямбду. - person acw1668; 25.09.2020
comment
О, я не заметил, что параметр, да, вы правы. - person Cool Cloud; 25.09.2020

Понятно!

Редактировать: я немного изменил строку 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()
person ImpulsePenny    schedule 25.09.2020
comment
Здесь не приветствуются ответы, содержащие только код. Пожалуйста, отредактируйте его и скажите, что вы сделали, чтобы устранить проблему. - person martineau; 25.09.2020
comment
Это ответ только на код на ваш собственный вопрос, но вы сказали, что у вас есть или что отличается от кода в вашем вопросе, поэтому это делает его менее информативным для других. - person martineau; 25.09.2020