2012-03-06 59 views
1

您好StackOverflow Hive Mind;wxPython:MenuBar綁定事件在Init上執行

我正在學習如何使用wxPython,它爲我正在編寫的應用程序製作GUI。我一直在深入研究,直到我注意到我無法正確創建菜單欄。無論我做錯了什麼,都會導致我的事件綁定在程序運行時執行。這是有問題的代碼。應該忽略小的拼寫錯誤,我正在重新鍵入我的開發機器,這是脫機的,所以我可能會在這裏或那裏錯過一個關鍵。

def onDocClick(): 
    message = wx.MessageBox("did it work?","Question",wx.YES_NO) 

def onAboutClick(): 
    pass 

frame = wx.Frame(parent=None,title="RVR GUI",size=(315,490)) 
frame.Show() 
panel = wx.Panel(frame,-1,size=(315,490) 

menubar = wx.MenuBar() 
fileMenu = wx.Menu() 
documentation = fileMenu.Append(wx.ID_NEW,"Documentation") 
about = fileMenu.Append(wx.ID_ABOUT,"About") 
menuBar.Append(fileMenu,'File') 

frame.SetMenuBar(menubar) 
menubar.Bind(wx.EVT_MENU,onDocClick(),documentation) 
menubar.Bind(wx.EVT_MENU,onAboutClick(),about) 

還有很多更重要的GUI比,但代碼的其餘部分工作正常,所以我不認爲你需要它。基本上發生的是,只要我運行打開GUI的腳本,onDocClick()中的消息框就會執行。其中一個我點擊amy按鈕,GUI的其餘部分初始化正常,點擊「文檔」菜單條目絕對不會發生任何事情。我有一種感覺,我很可能錯過了一些簡單的東西,或許是wx.EVT_MENU在這種情況下不適合使用?如果是這樣的話,那麼正確的使用是什麼?我在wxPython上看到的每一個教程都是這樣做的,沒有解釋。老實說,我對wxPython缺乏有意義的文檔感到震驚。 Zetcode教程,甚至是永遠有用的Mouse vs Python,似乎都正釉於工具包工作原理的基礎上。但是我離題了,我一直在做,我剛剛被這個完全弄糊塗了。無論如何謝謝,我感謝任何迴應!

Michael

回答

1

你應該仔細看看你的代碼。我認爲你在使用wxPython方面做得很好,但是事件綁定沒有正確完成。您應該通過方法名稱作爲Bind方法的參數。相反,您可以調用方法(這會導致在UI構建過程中執行綁定方法)。要解決它,你必須省略括號。你上市的最後兩行應該成爲這樣的:

menubar.Bind(wx.EVT_MENU, onDocClick, documentation) 
menubar.Bind(wx.EVT_MENU, onAboutClick, about) 

我嘗試了你的代碼,並BrtH是正確的,我是不是successul從菜單欄綁定,應該從wx.Frame實例綁定事件。 您完成後,可運行的例子,現在看起來是這樣的:

import wx 

def onDocClick(evt): 
    message = wx.MessageBox("did it work?","Question",wx.YES_NO) 

def onAboutClick(evt): 
    print "clicked" 

app = wx.App() 
frame = wx.Frame(parent=None,title="RVR GUI",size=(315,490)) 
frame.Show() 
panel = wx.Panel(frame,-1,size=(315,490)) 

menubar = wx.MenuBar() 
fileMenu = wx.Menu() 
documentation = fileMenu.Append(wx.ID_NEW,"Documentation") 
about = fileMenu.Append(wx.ID_ABOUT,"About") 
menubar.Append(fileMenu,'File') 

frame.SetMenuBar(menubar) 
frame.Bind(wx.EVT_MENU,onDocClick,documentation) 
frame.Bind(wx.EVT_MENU,onAboutClick,about) 
app.MainLoop() 
+0

謝謝菲尼亞斯,你的建議我現在能夠得到該代碼按計劃工作!你搖滾! – 2012-03-06 18:57:23

-1

您綁定到錯誤的事情。改爲綁定到框架。嘗試frame.Bind(wx.EVT_MENU,onDocClick(),documentation)

+0

感謝您的支持,並對此表示贊同。然而,第二個參數仍然會導致該函數在解釋時執行。然而,一旦發生了變化,我必須這樣做才能真正接收事件。 – 2012-03-06 19:00:22

+0

是的,因爲我注意到我的錯誤,我沒有看到明顯的其他錯誤。我的錯,對不起:( – BrtH 2012-03-06 19:16:55

+0

不要抱歉,沒有你的評論我可能仍然試圖找出爲什麼當我點擊時什麼都沒有發生!:p – 2012-03-06 20:06:15