WedX - журнал о программировании и компьютерных науках

OptionMenu add_command нужна прямая команда?

Я застрял

Я изменяю содержимое OptionMenu с помощью функции refresh(), и она отлично работает в случае A, но когда в случае B, когда я меняю его на обратный вызов, OptionMenu перестает работать. Щелчок по параметру больше не выбирает его.

Любая идея, что делает это так?

Случай А:

import tkinter as tk
root = tk.Tk()
cvar = tk.StringVar(root)
cvar.set("-")
optionlist = ('one', 'two', 'three')

def refresh(contentlist):
    optionmenu['menu'].delete(0, 'end')

    for content in contentlist:
        optionmenu['menu'].add_command(label=content, command=tk._setit(cvar, content))

def doNothing():
    return

optionmenu = tk.OptionMenu(root, cvar, *optionlist, command=doNothing)
optionmenu.pack()

refresh(optionlist)

root.mainloop()

Случай Б:

def contentcallback(var, name):
    tk._setit(var, name)

def refresh(contentlist):
    optionmenu['menu'].delete(0, 'end')

    for content in contentlist:
        optionmenu['menu'].add_command(label=content, command=contentcallback(cvar, content))

  • @stovfl Надеюсь, это вас удовлетворило 06.06.2020
  • Следует читать command=tk._setit(cvar, content, doNothing)) и def doNothing(event): 06.06.2020
  • См. stackoverflow.com/q/5767228/7432. 06.06.2020

Ответы:


1

@stovfl сделал комментарий, который дал мне другое решение

tk._setit имеет функцию обратного вызова, о которой я не знал. Используя этот обратный вызов, я могу сделать:

def contentcallback(var, name):
    #Whatever I need to do

def refresh(contentlist):
    optionmenu['menu'].delete(0, 'end')

    for content in contentlist:
        optionmenu['menu'].add_command(label=content, command=tk._setit(var, name, lambda cv=cvar, con=content: contentcallback(cv, con)))

РЕДАКТИРОВАТЬ: @BryanOakley дал ссылку, почему мое исходное решение было полно дыр

Метод tk._setit возвращает объект, необходимый для его работы. Исходный обратный вызов содержимого вызывал только метод, а не тот, что стоит за ним. Это сделало настройку немного странной:

def contentcallback(var, name, func):
    #Whatever I need to do
    func()

def refresh(contentlist):
    optionmenu['menu'].delete(0, 'end')

    for content in contentlist:
        optionmenu['menu'].add_command(label=content, command=lambda cv=cvar, co=content, func=tk._setit(cvar, content): contentcallback(cvar, co, func))
06.06.2020
  • cvar.get() внутри def callback(... делает то же самое без lambda ... 06.06.2020
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]