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

wxPython-传入-1时如何获取小部件的ID?,python,wxpython,Python,Wxpython,我今天做了一点wxPython的工作,我得到了这段代码(我去掉了不相关的部分): 如何获取已创建按钮的ID,以便将它们绑定到处理程序?通常,我会这样做: button1 = wx.Button(...) button2 = wx.Button(...) ... self.Bind(wx.EVT_BUTTON, self.Blah, button1.GetID()) self

我今天做了一点wxPython的工作,我得到了这段代码(我去掉了不相关的部分):

如何获取已创建按钮的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())
但是我没有给任何按钮一个标识符。我必须手动分配身份证号码吗

我必须手动分配身份证号码吗

否,放置
-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
或使用
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)
我建议不要执行“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, ...)
   ...
我认为随着时间的推移,这会使代码更容易理解和维护。

我建议不要使用“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, ...)
   ...

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

您可以通过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()

您可以通过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()

但我没有创建按钮1或按钮2,我是这样做的:“hbox1.Add(wx.Button(pan,-1),1,wx.EXPAND | wx.ALL)”好的,更新后,你也可以这样做。所以基本上,对于每个小部件,我需要在某处引用ID号,无论我是否手动分配了它?你不需要绑定ID,看我的回答,但我没有创建按钮1或按钮2,我这样做了:“hbox1.Add(wx.Button(pan,-1),1,wx.EXPAND | wx.ALL)”好的,更新了,你也可以这样做。所以基本上,对于每个小部件,我都需要在某个地方引用一个ID号,无论我是否手动分配了它?你不需要绑定ID,看我的回答当我第一次开始学习wxPython时,我遵循的教程就是这样,它们将小部件的创建和布局结合在一起。我一直认为wxPython在没有标识符或手动定义的ID的情况下有某种检索ID的方法,而且,用“更长”的方法检索ID似乎与我所学到的背道而驰,即用更少的代码完成更多的工作。不要让创建更少代码的愿望导致编写错误的代码量。虽然我们都应该努力写更少的代码,但我们应该写尽可能少的代码行,但不能少。请记住,您的最终目标是编写a)有效,b)可维护的代码。在我看来,将代码塞进更少的行对这两个目标都不起作用。当我第一次开始学习wxPython时,我遵循的教程就是这样,它们将小部件的创建和布局组合在一行中。我一直认为wxPython在没有标识符或手动定义的ID的情况下有某种检索ID的方法,而且,用“更长”的方法检索ID似乎与我所学到的背道而驰,即用更少的代码完成更多的工作。不要让创建更少代码的愿望导致编写错误的代码量。虽然我们都应该努力写更少的代码,但我们应该写尽可能少的代码行,但不能少。请记住,您的最终目标是编写a)有效,b)可维护的代码。将代码塞进更少的行对这两个目标都不起作用。