2012-10-05 34 views
1

該程序是當單擊按鈕時,wx.textctrl被寫入「單擊」。使用類時的Python類型錯誤(wx.Python)

此代碼無誤地運行。

import wx 

class Mainwindow(wx.Frame): 

    def __init__(self, parent, id, title): 
     wx.Frame.__init__(self, parent, id, title, size=(300, 300)) 
     panel = wx.Panel(self, -1) 

     vbox = wx.BoxSizer(wx.VERTICAL) 

     hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
     btn = wx.Button(panel, -1, 'OK', size=(70, 30)) 
     btn.Bind(wx.EVT_BUTTON, self.click_btn) #line 12 
     hbox1.Add(btn, 0) 
     vbox.Add(hbox1, 0) 

     hbox2 = wx.BoxSizer(wx.HORIZONTAL) 
     self.tc = wx.TextCtrl(panel, -1, style=wx.TE_MULTILINE) 
     hbox2.Add(self.tc, 1, wx.EXPAND) 
     vbox.Add(hbox2, 1, wx.EXPAND) 

     panel.SetSizer(vbox) 

     self.Centre() 
     self.Show(True) 


    def click_btn(self, event): #line 27 
     self.tc.WriteText("clicked\n") #line 28 



if __name__=="__main__": 
    app = wx.App() 
    Mainwindow(None, -1, u"sample") 
    app.MainLoop() 

但是,如果此代碼以這種方式變化,它會得到錯誤。

變化到管線12

btn.Bind(wx.EVT_BUTTON, Click_btn.click_btn) 

變化到線27和28

該錯誤是:類型錯誤:未結合的方法click_btn()必須與Click_btn實例作爲第一個參數被稱爲(改爲CommandEvent實例)

我不知道如何處理這個錯誤。

* Postscript

我閱讀答案,並且此代碼更改。但它不運行...

改變管線12

button = Click_btn() 
btn.Bind(wx.EVT_BUTTON, button.click_btn) 

改變線路27和28

class Click_btn(Mainwindow): 
    def click_btn(self, event): 
     Mainwindow.tc.WriteText("clicked\n") 

請示教點,我應該改變。

回答

2
class Click_btn: 
    @classmethod 
    def click_btn(cls, event): 
     cls.tc.WriteText("clicked\n") #this will probably break now 

這將允許您調用它的類,而不是類的實例

類是Click_btn

一個實例是btn = Click_btn()(BTN是Click_btn的實例)

1

首先,您應該開車從object開始:

但這不是問題。要獲得綁定方法,您必須編寫如下的Bind

# create an instance 
button = Click_btn() 
# and now assign the click_btn method of that instance 
btn.Bind(wx.EVT_BUTTON, button.click_btn)