如何将 wxWidget 传递给通用函数?
How to pass a wxWidget to a generic function?
诚然,我对面向对象的任何事情都感到很吃力。所以我不太理解整个地方的 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()))
实际上,如果您将它们设为 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()))
诚然,我对面向对象的任何事情都感到很吃力。所以我不太理解整个地方的 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()))
实际上,如果您将它们设为 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()))