2009-12-10 44 views
1

我做了一點工作的wxPython今天我有這一段代碼(我已經剝離出來的不相關部分):wxPython - 當你傳入-1時如何獲取小部件的ID?

 def CreateRowOne(self, pan): 
      hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
      hbox1.Add(wx.Button(pan, -1, "250 Words"), 1, wx.EXPAND | wx.ALL) 
      hbox1.Add(wx.Button(pan, -1, "500 Words"), 1, wx.EXPAND | wx.ALL) 
      hbox1.Add(wx.Button(pan, -1, "750 Words"), 1, wx.EXPAND | wx.ALL) 
      return hbox1 

你如何創建的按鈕的ID ,所以我可以將它們綁定到處理程序?通常,我會這樣做:

  button1 = wx.Button(...) 
      button2 = wx.Button(...) 

      ... 

      self.Bind(wx.EVT_BUTTON, self.Blah, button1.GetID()) 
      self.Bind(wx.EVT_BUTTON, self.Blah2, button2.GetID()) 

但我沒有給任何按鈕的標識符。我將不得不手動分配ID號碼嗎?

回答

3

您可以通過control.GetID(獲得ID),但你並不需要拿到ID綁定,你可以做到這一點

self.btn.Bind(wx.EVT_BUTTON, self._onBtnClick) 

優選(ID應該是對執行細節)和短例如這個樣本

import wx 

app = wx.PySimpleApp() 
frame = wx.Frame(None) 
btn = wx.Button(frame, -1, "anurag") 
btn.Bind(wx.EVT_BUTTON, lambda e:wx.MessageBox("Wow it works")) 
frame.Show() 
app.SetTopWindow(frame) 
app.MainLoop() 
2

我將不得不手動分配ID號碼嗎?

沒有,把-1或使用wx.NewId()會給你自動生成的ID。

您隨時可以隨時收到button1.GetID()button1.Id

-

UPDATE

ID_BUTTON1 = wx.NewId() 

hbox1.Add(wx.Button(pan, ID_BUTTON1, "250 Words"), 1, wx.EXPAND | wx.ALL) 

self.Bind(wx.EVT_BUTTON, self.Blah, ID_BUTTON1) 
+0

但我沒有創建一個按鈕1或按鈕2中,我這樣做: 「hbox1.Add(wx.Button(鍋,-1),1,wx.EXPAND | wx.ALL )「 – cornjuliox 2009-12-10 09:33:12

+0

好的,更新,你也可以這樣做。 – YOU 2009-12-10 09:46:37

+0

因此,基本上對於每個小部件,我需要在某處引用一個ID號,無論我是否手動分配它? – cornjuliox 2009-12-10 13:30:48

1

我建議做 「sizer.Add(wx.Button(...))」。分開小部件創建和佈局會更好。是否有一個令人信服的理由按照您的方式編寫代碼?爲什麼不寫這樣的:

button1=wx.Button(pan, wx.ID_ANY, ...) 
button2=wx.Button(pan, wx.ID_ANY, ...) 
... 
hbox1.Add(button1) 
hbox1.Add(button2) 
... 
self.Bind(wx.EVT_BUTTON, self.Blah, button1.GetID()) 
self.Bind(wx.EVT_BUTTON, self.Blah2, button2.GetID()) 

有根本的合併按鈕創建並在一條線將其添加到分級機沒有收穫。

我個人看到的將ID分配更大的價值,但可以爲大量的小部件是繁重的。我通常只對「重要」小部件這樣做 - 我在代碼的其他部分中提到的小部件。我的代碼通常是這樣的:

ID_BUTTON1 = wx.NewID() 
IO_BUTTON2 = wx.NewID() 

class ...: 
    ... 
    button1 = wx.Button(self, ID_BUTTON1, ...) 
    ... 
    self.Bind(wx.EVT_BUTTON, ID_BUTTON1, ...) 
    ... 

我認爲這使得代碼更容易理解,更容易維護隨着時間的推移。

+0

當我第一次開始學習wxPython時,我遵循的教程是這樣看的,他們將小部件創建和佈局組合在一行中。我一直認爲wxPython在沒有標識符或手動定義的ID的情況下有一些檢索ID的方法,再加上,「更長」的方式似乎違背了我學到的東西 - 也就是說,要用更少的代碼完成更多工作。 – cornjuliox 2009-12-10 16:59:37

+0

不要讓創建更少代碼的願望會導致您編寫不正確的代碼量。雖然我們都應該努力編寫更少的代碼,但我們應該儘可能少寫代碼,但不要少。記住,你的最終目標是編寫a)工作的代碼,b)是可維護的。將代碼編入更少的行並不適用於IMO的這些目標。 – 2009-12-10 17:26:02