我今天正在做一些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())
但我没有给任何按钮指定标识符。我是否必须手动分配身份证号码?
答案 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, ...)
...
我认为这使代码更容易理解,并且随着时间的推移更容易维护。