2015-12-02 49 views
0

我想在Tk中創建一個彈出菜單,但是當我到達要顯示菜單的部分(menu.post)時,我得到一個「TclError」例外。我不明白爲什麼,並且當我嘗試進入Tk代碼以查看發生了什麼問題時,在我突然無法再進入代碼並且異常冒出來之前,我只進行了幾個步驟。有人能告訴我我做錯了什麼嗎?我認爲這與我如何創建菜單有關。Python 2.7.x Tkinter彈出菜單拋出tclError

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

編輯原始評論添加錯誤消息。 – Goishin

+0

如果你創建了[mcve](http://stackoverflow.com/help/mcve),它確實會有所幫助。問題中的大部分代碼不需要重現您的問題,並且_is_必需的代碼缺失。 –

回答

2

好的。我認爲你必須將菜單分配到根窗口。爲此,請添加行self.config(menu=self.menu)。除此之外,你打電話給菜單時沒有窗口顯示。

編輯

也不能設置爲overrideredirect,因爲它不支持彈出菜單。如果在窗口未對焦時右鍵單擊該窗口,也會出現錯誤。

希望這會有所幫助!

+0

甜!謝謝你的回答@jonah!哎呦。我說得太快了。我試過了,它沒有改變任何東西。當我打電話給self.menu.post時,我仍然遇到TclError。 – Goishin

+0

我已修復@Goishin的答案,但它可能會填滿您的應用程序。對不起...... :( –

+0

好吧,當我連續幾次右鍵單擊時,我會遇到一堆例外情況,有時候會出現一個彈出式菜單,所以,我想從技術上說,你是對的,但這完全破壞了我的應用程序。也許右鍵菜單是不是要走的路:( – Goishin