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)。这就是你得到影子的原因。不过还有一些其他注意事项:
希望对您有所帮助!