【问题标题】:tkinter option menu doesn't execute callback function for option created via .add_command(label='New Item')tkinter 选项菜单不会为通过 .add_command(label='New Item') 创建的选项执行回调函数
【发布时间】:2021-04-29 17:39:42
【问题描述】:

我的第一次 tkinter 体验相当顺利,但现在我被难住了。

我抓取了我在另一个线程上看到的一些代码,并添加了一个“新项目”。我可以看到选择“新项目”时未执行回调函数。 StrVar 不会像初始项目一样针对“新项目”进行更新。如果 StrVar 确实更新了,那么我就不需要回调函数了。

我尝试使用 .__setit()、.trace_add()、回调函数以及一些 .configure 东西来解决这个问题。我错过了什么?我需要让用户能够看到他们选择的项目。

import tkinter as tk

def callback(selection):
    print(selection)

root = tk.Tk()
options = tk.StringVar()
menu = tk.OptionMenu(root, options, 'a', 'b', 'c', command=callback)
menu.pack()
menu['menu'].add_command(label='New Item')
options.set('a')
root.mainloop()

【问题讨论】:

  • 您是否尝试将command=callback 添加到.add_command(label="New Item")
  • @TheLizzard 你太快了 :(
  • @TkinterLover :D 我的方法会引发错误......所以我不认为我的答案是
  • @hilton8r 看看我在答案上发表的评论
  • 谢谢你们!我尝试了很多可能接近的变化。我想我错过了将回调函数绑定到“新项目”以及将变量传递给错误位置的回调函数。

标签: python tkinter


【解决方案1】:

您需要为添加的每个选项分配命令。此外,您需要在末尾添加options.set(selection) 以确保选中“新项目”选项。

代码:

import tkinter as tk

def callback(selection):
    print(selection)
    options.set(selection)

root = tk.Tk()
options = tk.StringVar()
menu = tk.OptionMenu(root, options, 'a', 'b', 'c', command=callback)
menu.pack()
menu['menu'].add_command(label='New Item', command=lambda: callback('New Item'))
options.set('a')
root.mainloop()

【讨论】:

  • 当我测试它并点击"New Item" 时,由于某种原因,它并没有更改 GUI 中的选项。您可能想在callback 末尾添加options.set(selection)
  • 我不知道你为什么需要它,也不知道tk.OptionMenu 是如何工作的。我总是只使用tk.Menu
  • @TkinterLover 我问了一个新问题,因为我无法在我的项目中使用它。唯一的区别是逐个添加选项与从 for 循环中添加选项。希望你和 TheLizzard 可以看一看。堆栈溢出的新手,因此试图找出标记等...
猜你喜欢
  • 2016-10-02
  • 2012-03-18
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多