Python 2.7.x Tkinter弹出菜单抛出tclError

时间:2015-12-02 18:01:22

标签: python python-2.7 tkinter

我正在尝试在Tk中创建一个弹出菜单,但是当我到达要显示菜单的部分(menu.post)时,我得到一个“TclError”异常。我不明白为什么,当我尝试进入Tk代码看看出了什么问题时,我只是进入了几个步骤之前我突然无法再进入代码并且异常冒泡了。有人能告诉我我做错了什么吗?我认为这与我创建菜单的方式有关。

class Bugger(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        # setup window attributes
        self.overrideredirect(True)
        self.attributes('-topmost', 1)

        # set starting positions and values
        self.TotalAssigned = "0"
        self.TotalResolved = "0"

        # add first label
        self.label1 = tk.Label(self, text=self.TotalAssigned, bg="red")
        self.label1.pack(side="left", fill="both", expand=True)

        # add second label
        self.label2 = tk.Label(self, text=self.TotalResolved, bg="yellow")
        self.label2.pack(side="right", fill="both", expand=True)

        # add right-click menu
        self.menu = tk.Menu(master=self, tearoff=0)
        self.menu.add_command(label="Exit", command=self.ExitMenu)
        self.menu.add_command(label="Preferences", command=self.Preferences)
        self.bind("<ButtonRelease-2>", self.popup)

    def ExitMenu(self):
        exit(0)

    def popup(self, event):
        self.menu.post(event.x_root,event.y_root)

    def Preferences(self):
        print ("In preferences dialog")


if __name__ == "__main__":

    bugger = Bugger()
    bugger.mainloop()

TclError异常发生在self.menu.post行(event.x_root,event.y_root)

编辑:这是我得到的错误。我不知道为什么我第一次不包括这个。

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in __call__
    return self.func(*args)
  File "/Users/robb/source/Bugger.py", line 73, in popup
    self.menu.post(event.x_root,event.y_root)
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 2797, in post
    self.tk.call(self._w, 'post', x, y)

TclError

对我有什么建议吗?

1 个答案:

答案 0 :(得分:2)

确定。我认为你必须将菜单分配给根窗口。为此,请添加第self.config(menu=self.menu)行。其他明智的做法就是在没有窗口显示的情况下调用菜单。

修改

它也不能设置为overrideredirect,因为它不支持弹出菜单。如果在焦点未对焦时右键单击窗口,也会出现错误。

希望这有帮助!