wxPython - 如何在传入-1时获取窗口小部件的ID?

时间:2009-12-10 09:09:45

标签: python wxpython

我今天正在做一些wxPython工作,我已经得到了这段代码(我已经删除了不相关的部分):

        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())

但我没有给任何按钮指定标识符。我是否必须手动分配身份证号码?

3 个答案:

答案 0 :(得分:3)

  
    

我是否必须手动分配身份证号码?

  

不,使用-1或使用wx.NewId()会为您提供自动生成的ID。

并且您随时可以通过button1.GetID()button1.Id获取ID。

-

<强>更新

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)

答案 1 :(得分: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 :(得分: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())

组合按钮创建并将其添加到一行中的sizer中没有任何好处。

我个人认为在分配ID方面有更大的价值,但对于大量的小部件来说这可能是繁重的。我通常只对“重要”小部件这样做 - 我在代码的其他部分引用的小部件。我的代码通常如下:

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

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

我认为这使代码更容易理解,并且随着时间的推移更容易维护。