【问题标题】:OptionMenu add_command needs direct command?OptionMenu add_command 需要直接命令吗?
【发布时间】:2020-06-06 08:22:25
【问题描述】:

我被卡住了

我正在使用 refresh() 函数更改 OptionMenu 的内容,它在情况 A 中工作正常,但在情况 B 中我将其更改为回调时,OptionMenu 停止工作。点击一个选项不再选择它。

知道是什么原因吗?

案例A:

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

案例 B:

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

【问题讨论】:

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


【解决方案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 方法返回一个使其工作所需的对象。原来的 contentcallback 只调用了方法而不是它背后的方法。这让设置有点奇怪:

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

【讨论】:

  • cvar.get() inside def callback(... 在没有 lambda ... 的情况下也是如此
猜你喜欢
  • 2021-02-26
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
相关资源
最近更新 更多