我正在尝试在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
对我有什么建议吗?
答案 0 :(得分:2)
确定。我认为你必须将菜单分配给根窗口。为此,请添加第self.config(menu=self.menu)
行。其他明智的做法就是在没有窗口显示的情况下调用菜单。
修改强>
它也不能设置为overrideredirect
,因为它不支持弹出菜单。如果在焦点未对焦时右键单击窗口,也会出现错误。
希望这有帮助!