更新其來自列表的選項菜單

2024-06-07 00:33:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我的GUI中有一个OptionMenu,它由一个列表填充。每次用户运行某个进程时,列表都会更新以反映这一点。有没有办法根据列表更新选项菜单?我试过按照this question来做self.plotWindow.update(),但没有成功。但是,关闭并重新打开窗口会像您所期望的那样刷新选项菜单。相关代码:

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

Tags: self列表newgetif选项菜单update
1条回答
网友
1楼 · 发布于 2024-06-07 00:33:10

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

您可以通过获取OptionMenu的menu来实现这一点,并向其中添加命令。下面的示例演示如何执行此操作(基于this answer)。

它表明,即使使用“Add option to list”按钮在self.options列表后面附加了一个选项,OptionMenu也不会自动更改。要更新option menu,您可以为此使用“更新选项菜单”按钮,该按钮调用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()

相关问题 更多 >