Как обновить команду OptionMenu

Я пытаюсь установить или обновить команду OptionMenu после ее создания.

widget.configure(command=foo) заявление работает дляButton а такжеCheckButton, но не дляOptionMenu.

Следующий код вызывает эту ошибку:_tkinter.TclError: unknown option "-command"

from Tkinter import Tk, OptionMenu, StringVar

root = Tk()
var = StringVar()

def foo(val):
    print val, var.get()

widget = OptionMenu(root, var, "one", 'two')
widget.configure(command=foo)
widget.pack()
root.mainloop()
 Pablo08 июн. 2016 г., 17:47
Я хочу определить команду, которая будет выполняться при выборе, чтобы я мог отправить выбранное значение бэкэнду.
 martineau13 авг. 2017 г., 17:00
@Bryan:OptionMenus делать принятьcommand= Аргумент option и будет вызывать целевую функцию, указанную, когда что-то на ней выбрано (и передать ей значение связанного пункта меню в качестве аргумента).
 Bryan Oakley08 июн. 2016 г., 17:36
опционные меню не имеют команды, поэтому нет ничегоОбновить, Вы хотите обновитьценности что появиться? Или вы хотитеопределять команда для запуска при изменении значения? Это возможно, поэтому, пожалуйста, уточните, чего вы на самом деле пытаетесь достичь.

Ответы на вопрос(3)

Решение Вопроса

Я думаю, что вы действительно спрашиваете, как связать команду сOptionmenu, скорее, чемОбновить команда (команды нет, поэтому обновлять нечего).

Если вы хотите, чтобы функция вызывалась каждый раз, когда значение выбирается изOptionmenu, вы можете добавить след на связанной переменной. Трассировка будет вызывать функцию всякий раз, когда эта переменная изменяется, будь то черезOptionmenu или любым другим способом.

Например:

...
var = tk.StringVar()
def foo(*args):
    print "the value changed...", var.get()
var.trace("w", foo)
...

Когда функция вызывается, она передаст три аргумента, которые в этом случае можно смело игнорировать.

Для получения дополнительной информации о переменных следах см.http://effbot.org/tkinterbook/variable.htm

Вы также можете рассмотреть возможность перехода наTtk Combobox, Поддерживает привязку к<<ComboboxSelected>>, что немного менее неуклюже, чем делать переменную трассировку.

Хороший вопрос! Хорошо, что мне никогда не приходилось делать это ни в одном из моих проектов раньше, потому что (если кто-то не докажет, что я не прав) Вы не можете установить / обновить команду виджета OptionMenu, если он уже определен.

Если бы Tkinter хотел, чтобы вы могли это сделать, он определенно включил бы его для редактирования.configure()

Есть удобная функция под названием.keys() который вы можете вызвать с помощью объекта виджета, чтобы увидеть все доступные черты, которые могут быть использованы с.configure().

Пример кнопки:

from tkinter import *

master = Tk()

def callback():
    print ("click!")

b = Button(master, text="OK", command=callback)
print (b.keys()) #Printing .keys()
b.pack()

mainloop()

Что приводит к:

Обратите внимание, как в этом огромном списке ключей,'command' находится на второй линии? Это потому, что кнопкиcommand МОЖЕТ быть использовано в.configure()

Пример OptionMenu:

from tkinter import *

root = Tk()
var = StringVar()

def foo(val):
    print ("HI")

widget = OptionMenu(root, var, "one", 'two')
print(widget.keys())
widget.pack()
root.mainloop()

Что приводит к:

Обратите внимание, как нет'command' на линии 2 на этот раз. Это потому, что вы не можете настроитьcommand с виджетом OptionMenu.

Надеюсь, эта проблема не слишком мешает вашей программе, и я надеюсь, что мой ответ помог вам лучше понять!

 Bryan Oakley08 июн. 2016 г., 17:35
@Pablo: почему бы тебе просто не воссоздать опциональное меню?
 martineau13 авг. 2017 г., 19:50
Стрелок: см.мой ответ для примера сделать это.
 Pablo08 июн. 2016 г., 17:25
Это ограничение не позволяет мне динамически связывать графический интерфейс с моим бэкэндом.
 Bryan Oakley08 июн. 2016 г., 17:37
На самом деле, выМожно Измените команду меню параметров, но есть причина, по которой он скрыт - атрибут команды каждого элемента меню используется для внутреннего изменения значения меню параметров, когда кто-то выбирает элемент из списка. Если вы измените эту команду, вы можете нарушить поведение optionmenu. В конечном счете, однако, меню опций - это не что иное, как Menubutton и Menu, и внутренне tkinter использует атрибут команды в меню, чтобы поддерживать их синхронизацию.

Можно изменить команды, связанные с расширением OptionMenu, если вы будете осторожны (как прокомментировал @Bryan Oakley). Ниже приведен пример этого.

Самое сложное, вы должны перенастроитьвсе пункты меню, а не только один из них. Это требует дополнительной бухгалтерии (и некоторых накладных расходов на обработку, но это незаметно).

Изначально меню состоит из трех пунктов, каждый из которых имеет свою функцию, которая вызывается при выборе, один из которых меняет меню. Если последний выбран, меню изменяется только на два элемента меню, каждый из которых вызывает одну и ту же функцию.

from tkinter import *

root = Tk()
var = StringVar()
var.set('Select')

def foo(value):
    var.set(value)
    print("foo1" + value)

def foo2(value):
    var.set(value)
    print("foo2 " + value)

def foo3(value):
    var.set(value)
    print("foo3 " + value)

def change_menu(value):
    var.set('Select')
    print('changing optionmenu commands')
    populate_menu(optionmenu, one=foo3, two=foo3)

def populate_menu(optionmenu, **cmds):
    menu = optionmenu['menu']
    menu.delete(0, "end")
    for name, func in cmds.items():
        menu.add_command(label=name, command=
                         lambda name=name, func=func: func(name))

optionmenu = OptionMenu(root, var, ())  # no choices supplied here
optionmenu.pack()
Label(root, textvariable=var).pack()

populate_menu(optionmenu, one=foo, two=foo2, change=change_menu)

root.mainloop()

Ваш ответ на вопрос