2014-07-01 37 views
0

當我在IDE中運行代碼時,按鈕綁定事件會自動運行,而不是等待我單擊該按鈕。然後,當事件完成並且面板出現時,單擊按鈕時不會執行任何操作。單擊之前運行的wxpython按鈕事件

我想我已經按照我在網上找到的例子,但它仍然有這種奇怪的行爲?有任何想法嗎?謝謝!

代碼如下。 (更新了額外的比特)

def main(): 
    pass 

if __name__ == '__main__': 
    main() 


import wx 

class Frame(wx.Frame): 

    def __init__(self,parent,id): 
     self.headr(parent,id) 



    def headr(self,parent,id): 
     wx.Frame.__init__(self,parent,id, 'My Program', size =(300,300)) 
     panel=wx.Panel(self) 
     status = self.CreateStatusBar() 


     uploadButton = wx.Button(panel,label="Upload",pos=(20, 30)) 
     uploadButton.Bind(wx.EVT_BUTTON,self.printIt()) 


    def printIt(self): 
     print("Function has run") 

if __name__== '__main__': 
    app=wx.App() 
    frame = Frame(parent=None,id=1) 
    frame.Show() 
    app.MainLoop() 
+0

您發佈的代碼將不會運行。請發佈一個最簡單的工作示例 – wnnmaw

回答

0

的問題是,你實際上是調用綁定聲明的方法:

uploadButton.Bind(wx.EVT_BUTTON,self.printIt()) 

刪除括號制止這種行爲,就像這樣:

uploadButton.Bind(wx.EVT_BUTTON,self.printIt) 

現在它應該按照您的預期工作。

該代碼的另一個問題是,該方法需要接受兩個參數:self和一個事件。這裏是你的代碼編輯,以正常工作:

import wx 

class Frame(wx.Frame): 

    def __init__(self,parent,id): 
     self.headr(parent,id) 



    def headr(self,parent,id): 
     wx.Frame.__init__(self,parent,id, 'My Program', size =(300,300)) 
     panel=wx.Panel(self) 
     status = self.CreateStatusBar() 


     uploadButton = wx.Button(panel,label="Upload",pos=(20, 30)) 
     uploadButton.Bind(wx.EVT_BUTTON,self.printIt) 


    def printIt(self, event): 
     print("Function has run") 

if __name__== '__main__': 
    app=wx.App() 
    frame = Frame(parent=None,id=1) 
    frame.Show() 
    app.MainLoop() 
+0

我只是注意到括號問題,並在事件問題上跳閘,所以你清除它們兩個,謝謝!最後一個問題,在這裏不是python pro,如果我想將一個參數傳遞給我想在點擊按鈕時運行的函數呢?我可以做到沒有括號? – user2920832

+0

您必須使用lambda或functools來傳遞參數。在wxPython wiki上有兩個很好的例子:http://wiki.wxpython.org/Passing%20Arguments%20to%20Callbacks –

+0

k謝謝!偉大的幫助。 – user2920832