Python/Tkinter OptionMenu 更新创建 "Shadow" 菜单
Python/Tkinter OptionMenu Update creates a "Shadow" of the Menu
所以我对此还是很陌生(我的代码应该使这一点显而易见)并且我正在使用 tkinter 开发 GUI。
我正在尝试使用一个 OptionMenu 来显示字典中的键,然后单击一个键我想查看该值。
我想修改那个字典,并希望能够更新所说的 OptionMenu。
到目前为止,还不错。现在我已经能够将其设置为 "work" - 但是当我更新菜单时(无论是否更改),我都会看到菜单本身的影子。
我编写了一个小测试程序:
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。我想它显示了。
非常感谢!
据我了解,这个小程序可以显示带有字典键的选项菜单,然后当你按 "change dict" 并更新它时,它应该将选项菜单切换到另一组项目?在这种情况下,您在错误的小部件上调用了销毁。唯一的问题是更新功能应该更改为:
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)
这将完成我认为您希望它完成的工作。正如您所知,选项菜单小部件实际上是按钮和菜单小部件的组合。因此,当您执行 menu = self.om["menu"] 时,您实际上是在获取 optionmenu 小部件的菜单对象,然后销毁它。然后,您将用选项菜单替换该变量并丢失原始菜单,同时不会破坏原始选项菜单 (self.om)。这就是你得到影子的原因。不过还有一些其他注意事项:
- 用户在切换列表时无需按 2 个按钮 - 从 changedict 函数调用更新函数,以便它自动填充。
- 您可以像开始时那样遍历菜单项,但您需要决定其中一项。完全销毁和启用widget或者更改当前widget的菜单项的效率我还比较有经验,我无法评价。
希望对您有所帮助!
所以我对此还是很陌生(我的代码应该使这一点显而易见)并且我正在使用 tkinter 开发 GUI。 我正在尝试使用一个 OptionMenu 来显示字典中的键,然后单击一个键我想查看该值。 我想修改那个字典,并希望能够更新所说的 OptionMenu。
到目前为止,还不错。现在我已经能够将其设置为 "work" - 但是当我更新菜单时(无论是否更改),我都会看到菜单本身的影子。
我编写了一个小测试程序:
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。我想它显示了。
非常感谢!
据我了解,这个小程序可以显示带有字典键的选项菜单,然后当你按 "change dict" 并更新它时,它应该将选项菜单切换到另一组项目?在这种情况下,您在错误的小部件上调用了销毁。唯一的问题是更新功能应该更改为:
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)
这将完成我认为您希望它完成的工作。正如您所知,选项菜单小部件实际上是按钮和菜单小部件的组合。因此,当您执行 menu = self.om["menu"] 时,您实际上是在获取 optionmenu 小部件的菜单对象,然后销毁它。然后,您将用选项菜单替换该变量并丢失原始菜单,同时不会破坏原始选项菜单 (self.om)。这就是你得到影子的原因。不过还有一些其他注意事项:
- 用户在切换列表时无需按 2 个按钮 - 从 changedict 函数调用更新函数,以便它自动填充。
- 您可以像开始时那样遍历菜单项,但您需要决定其中一项。完全销毁和启用widget或者更改当前widget的菜单项的效率我还比较有经验,我无法评价。
希望对您有所帮助!