不可否认,我很难面向对象。所以我不太了解所有地方的self
声明。也就是说,我有一个包含许多相同类型小部件的面板。
有没有办法让泛型函数接收一个小部件作为参数?
我希望底部的函数能够接收来自self.Bind
的参数,具体来说,我可以将self.sliderZone1
和self.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()))
答案 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()))