当前位置: 首页 > 面试题库 >

从列表更新OptionMenu

鲁浩渺
2023-03-14
问题内容

我的GUI中有一个由菜单填充的OptionMenu。每次用户运行某个进程时,列表都会更新以反映这一点。有没有一种方法可以基于列表更新OptionMenu?我已经试过self.plotWindow.update()按照这个问题,但无济于事。但是,关闭并重新打开该窗口并不会像您期望的那样刷新OptionMenu。相关代码:

if self.figNum.get() == 'New Figure...':
    if self.figList[-1] == 'New Figure...':
        self.figList.append(1)
    else:
        self.figList.append(self.figList[-1]+1)
    self.plotWindow.update() #tk.Tk() window
    self.i = self.figList[-1]
else:
    self.i = self.figNum.get()

问题答案:

OptionMenu中的选项未绑定到创建它们的列表。因此,更改列表不会更改OptionMenu,您必须自己对其进行更新。

您可以通过获取OptionMenu的来实现menu,并向其中添加命令。以下示例显示了如何执行此操作(基于此答案)。

它显示,即使self.options使用“向列表添加选项”按钮在列表中附加了选项,OptionMenu也不会自动更改。要更新OptionMenu,您可以为此使用“更新选项菜单”按钮self.update_option_menu。此功能从OptionMenu删除所有选项,并为中的每个项目插入一个新选项self.options

import Tkinter as tk

class App():
    def __init__(self, parent):
        self.parent = parent
        self.options = ['one', 'two', 'three']

        self.om_variable = tk.StringVar(self.parent)
        self.om_variable.set(self.options[0])
        self.om_variable.trace('w', self.option_select)

        self.om = tk.OptionMenu(self.parent, self.om_variable, *self.options)
        self.om.grid(column=0, row=0)

        self.label = tk.Label(self.parent, text='Enter new option')
        self.entry = tk.Entry(self.parent)
        self.button = tk.Button(self.parent, text='Add option to list', command=self.add_option)

        self.label.grid(column=1, row=0)
        self.entry.grid(column=1, row=1)
        self.button.grid(column=1, row=2)

        self.update_button = tk.Button(self.parent, text='Update option menu', command=self.update_option_menu)
        self.update_button.grid(column=0, row=2)

    def update_option_menu(self):
        menu = self.om["menu"]
        menu.delete(0, "end")
        for string in self.options:
            menu.add_command(label=string, 
                             command=lambda value=string: self.om_variable.set(value))

    def add_option(self):
         self.options.append(self.entry.get())
         self.entry.delete(0, 'end')
         print self.options

    def option_select(self, *args):
        print self.om_variable.get()


root = tk.Tk()
App(root)
root.mainloop()


 类似资料:
  • 问题内容: 我在Hibernate中有标准协会。更新时,我正在创建新实体(使用关键字),并用必要的值(还插入ID)填充它。值来自UI。以相同的方式,我创建了子对象的新集合,用值(也插入了ID)填充每个子对象,并将集合存储在父对象中(使用setter或按方法)。 所以我的问题是:如何在更新父级时删除父级集合中的所有对象,并用新的集合替换它们。在新集合中,某些对象确实是新对象,而某些对象仅需要更新(它

  • 这看起来应该很简单,但我没有找到任何例子或留档。我有一个看起来像这样的Dynamodb表: 记录1:{姓名、电子邮件、项目[{product}、{item2}、{item3]} 记录2:(姓名、电子邮件、项目[{product}、{item2}、{item3]} 我需要能够更新items元素,即更新记录1中的item1对象。我可以通过硬编码list数组元素使用以下代码来实现这一点,但我不知道如何将

  • 我正在尝试使用选择查询更新一个表中的列。 它运行并更新整个列作为(文本字段)。 我尝试仅更新宗教几何与宗地几何相交的行。

  • 问题内容: 我正在尝试为实体框架创建一个查询,该查询将允许我获取ID列表并更新与它们关联的字段。 SQL中的示例: 如何将以上内容转换为实体框架? 问题答案: 像下面这样 更新: 您可以如下更新多个字段

  • 问题内容: 我想创建模块自动更新USB设备列表(不仅是大容量存储)。现在它的工作非常不礼貌- 它具有附加线程,该线程在1秒钟后更新了设备列表。但是也许您知道如何处理一些插件事件,这些事件会生成OS(例如Windows XP及更高版本),或者通过另一种方式简化此过程。感谢您的时间! 问题答案: 这个问题似乎是一半的设计,一半的实现。似乎您最担心要为Java USB服务(例如jUSB)找到某种方式来服

  • 更新索引 Dart允许修改List中项目的值。 换句话说,可以重写列表项的值。 以下example说明了相同的情况 - void main() { List l = [1, 2, 3,]; 1[0] = 123; print (1); } 上面的示例使用索引0更新List项的值。代码的输出将为 - [123, 2, 3] Using the List.replaceRan