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

2024-10-02 16:33:31 发布

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

所以我对这一点还是很陌生的(我的代码应该让这一点变得显而易见),我正在用tkinter开发一个GUI。 我正在尝试有一个选项菜单,显示键从一个dict和点击一个键我想看到值。 我想修改那个dict,并希望能够更新所说的选项菜单。在

到目前为止,还不错。现在我已经可以让这个“工作”了,但是当我更新菜单(更改或不更改之后),我会看到菜单本身的影子。在

我设计了一个小测试程序:

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。我想它显示了。在

非常感谢!在


Tags: selfmastertkinterdef菜单columnmydictcommand
1条回答
网友
1楼 · 发布于 2024-10-02 16:33:31

据我所知,这个小程序,你认为它用dict键显示一个选项菜单,然后当你按下“change dict”然后更新时,它应该将选项菜单切换到另一组项目?在这个案例中,你调用了错误的widget。唯一的问题是更新功能,该功能应更改为:

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小部件实际上是一个按钮和一个菜单小部件的组合。所以当你做菜单=自我.om[“menu”],您实际上是在获取optionmenu小部件的menu对象,然后销毁它。然后用optionmenu替换该变量,并在不破坏原始optionmenu的同时丢失原始菜单(自我.om). 这就是为什么你有阴影。不过,还有一些其他注意事项:

  1. 用户在切换列表时不需要按2个按钮-从changedict函数调用update函数,以便它自动填充。在
  2. 您可以在开始时迭代菜单项,但需要决定其中一项。我不能评论完全销毁和启用小部件或更改当前小部件菜单项的效率,因为我还很有经验。在

希望这有帮助!在

相关问题 更多 >