如何将 wxWidget 传递给通用函数?

How to pass a wxWidget to a generic function?

诚然,我对面向对象的任何事情都感到很吃力。所以我不太理解整个地方的 self 声明。也就是说,我有一个包含许多相同类型的小部件的面板。

有没有办法让通用函数接收小部件作为参数?

我希望底部的函数接收来自 self.Bind 的参数,具体来说,我可以将 self.sliderZone1self.tc_ZONEVOL1 传递给 def 吗?

我希望 def slider1Update 看起来像这样:

def sliderUpdate(self, event, slider, textctrl):
    textctrl.SetValue(str(slider.GetValue())

这可能吗?

伪代码:

 self.ck_ZONE1 = wx.CheckBox(self, -1, zoneNAME[0])
    self.ck_ZONE1.SetToolTip(wx.ToolTip("Click here to monitor volume for this zone."))

    self.tc_ZONEVOL1 = wx.TextCtrl(panel, -1, "", (0,0), (30,21))
    self.tc_ZONEVOL1.SetToolTip(wx.ToolTip("Set max volume for the zone (0-100)"))

    self.sliderZone1 = wx.Slider(self, -1, 50, 0, 100, size=(400,10), style=wx.SL_HORIZONTAL)
    self.Bind(wx.EVT_SLIDER, self.slider1Update)

    sizer.Add(self.ck_ZONE1, pos=(xIndex,0), flag=wx.EXPAND|wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=10)
    sizer.Add(self.sliderZone1, pos=(xIndex,1), flag=wx.EXPAND|wx.LEFT|wx.ALIGN_CENTER_VERTICAL, border=10)
    sizer.Add(self.tc_ZONEVOL1, pos=(xIndex,2), flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL, border=10).SetMinSize((30,22))

    # Read in config
    if self.ck_ZONE1.Label == "":
        self.ck_ZONE1.Label = zoneNAME[0]

    if self.tc_ZONEVOL1.Value == "":
        self.tc_ZONEVOL1.SetValue(str(self.sliderZone1.GetValue()))

    xIndex +=1


    pub.subscribe(self.setVolumePanel, 'setVolumePanel')
    sizer.AddGrowableCol(1)
    panel.SetSizer(sizer)

def slider1Update(self, event):
    self.tc_ZONEVOL1.SetValue(str(self.sliderZone1.GetValue()))

实际上,如果您将它们设为 class 变量,则无需传递它们,这就是 self. 的意思。您当前的编码方式应该可以正常工作:

def slider1Update(self, event):
    self.tc_ZONEVOL1.SetValue(str(self.sliderZone1.GetValue()))

这实际上是做您想做的事的通常方式。但是如果你想通过它们,你会这样做:

self.tc_ZONEVOL1 = wx.TextCtrl(panel, -1, "", (0,0), (30,21))
self.sliderZone1 = wx.Slider(self, -1, 50, 0, 100, size=(400,10),
                         style=wx.SL_HORIZONTAL)

self.Bind(wx.EVT_SLIDER,lambda event: self.sliderUpdate(
     event, self.sliderZone1, self.tc_ZONEVOL1,), self.sliderZone1)

然后您的事件处理程序看起来与您提到的方式相同:

def sliderUpdate(self, event, slider, textctrl):
    textctrl.SetValue(str(slider.GetValue())

这在此处的 wxPython wiki 中有所介绍:

它实际上提到了另一种使用 functools.partial 执行此操作的好方法,您可能也会喜欢。

要获取触发事件的对象,也可以使用event.GetObject(),像这样:

def slider1Update(self, event):
    self.tc_ZONEVOL1.SetValue(str(event.GetObject().GetValue()))

wx.EVT_SLIDER 事件也带有值,因此您也可以使用它。

def slider1Update(self, event):
    self.tc_ZONEVOL1.SetValue(str(event.GetInt()))