Python/Tkinter OptionMenu Update 创建菜单的”阴影”

Python/Tkinter OptionMenu Update creates a "Shadow" of the Menu

所以我对此还是很陌生(我的代码应该很明显),我正在使用 tkinter 开发一个 GUI。
我试图有一个 OptionMenu 显示来自字典的键,并且在单击一个键时我想查看该值。
我想修改那个字典,并希望能够更新所说的 OptionMenu.

到目前为止,一切都很好。现在我已经能够让它"工作" - 但是当我更新菜单时(无论是否更改),我都会得到菜单本身的阴影。

我编写了一个小测试程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import tkinter as tk
from tkinter import ttk

class MyApp():

    def __init__(self,master):

        self.master = master
        self.myDict =  {'Key1':1, 'Key2': 2, 'Key3':3}


        self.valueVar = tk.StringVar()
        self.valueVar.set("0.00")

        self.RCS = tk.Label(master, textvariable=self.valueVar).grid(row=5, column=3)

        updateButton = tk.Button(text="Update List", command =  self.update)
        updateButton.grid(row=4,column=4)

        changeButton = tk.Button(text="Change list", command =  self.changeDict)
        changeButton.grid(row=5,column=4)


        self.keyVar = tk.StringVar(master)

        self.om = ttk.OptionMenu(self.master, self.keyVar,"Select Key", *self.myDict, command = self.setKey )
        self.om.configure(width=20)
        self.om.grid(row=4, column=3)

    def setKey(self,Surface):
        self.valueVar.set(self.myDict[Surface])

    def update(self):
        menu = self.om["menu"]
        menu.delete(0,"end")
        menu.destroy
        menu = ttk.OptionMenu(self.master, self.keyVar,"Select Key", *self.myDict, command = self.setKey )
        menu.grid(row=4, column=3)

    def changeDict(self):
        self.myDict =  {'Key4':4, 'Key5': 5, 'Key6':6}

root = tk.Tk()
app = MyApp(root)
root.mainloop()

我需要改变什么?为什么?
通常我使用 Matlab。我猜它显示了。

非常感谢!


据我了解这个小程序,您可以使用 dict 的键显示选项菜单,然后当您按下"更改 dict"然后更新时,它应该将选项菜单切换到另一组项目?在这种情况下,您在错误的小部件上调用了destroy。唯一的问题是更新功能应更改为:

1
2
3
4
5
6
7
8
def update(self):
        #menu = self.om["menu"]
        #menu.delete(0,"end")
        #The above two menu items are not neede dif you are just going to destroy the widget
        self.om.destroy()
        self.om = ttk.OptionMenu(self.master, self.keyVar,"Select Key", *self.myDict, command = self.setKey )
        self.om.configure(width=20)
        self.om.grid(row=4, column=3)

这将做我认为你想要它做的事情。如您所知,optionmenu 小部件实际上是按钮和菜单小部件的组合。因此,当您执行 menu = self.om["menu"] 时,实际上是在获取 optionmenu 小部件的菜单对象,然后将其销毁。然后,您将用 optionmenu 替换该变量并丢失原始菜单,同时不破坏原始 optionmenu (self.om)。这就是你得到影子的原因。不过还有一些其他注意事项:

  • 用户在切换列表时无需按下 2 个按钮 - 从 changedict 函数调用更新函数,以便它自动填充。
  • 您可以在开始时迭代菜单项,但您需要决定其中一个。我无法评论完全销毁和启用小部件或更改当前小部件的菜单项的效率,因为我仍然很有经验。
  • 希望对您有所帮助!