如何将wxWidget传递给泛型函数?

时间:2016-04-24 22:32:41

标签: wxpython

不可否认,我很难面向对象。所以我不太了解所有地方的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()))

2 个答案:

答案 0 :(得分:1)

实际上,如果你让它们成为类变量,就没有必要传递它们,这就是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的好方法。

答案 1 :(得分:0)

要获取触发事件的对象,您还可以使用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()))