2016-04-24 1 views
0

По общему признанию, мне сложно ориентироваться в объекте. Поэтому я не совсем понимаю объявления self повсюду. Тем не менее, у меня есть панель с несколькими типами виджетов.Как передать wxWidget в общую функцию?

Есть ли способ, чтобы общая функция получала виджет в качестве аргумента?

Я хотел бы функцию в нижней части, чтобы получить аргументы из 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

Я не совсем есть энергия, чтобы подать полный ответ, но проверить [этот ответ] (http://stackoverflow.com/questions/173687/is-it-possible-to-pass- arguments-to-event-bindings) для передачи аргументов в привязки событий. Вам понадобится лямбда-функция. – dpwilson

ответ

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 здесь:

Это на самом деле упоминает еще один хороший способ сделать это, используя functools.partial, который вам тоже может понравиться.

+0

Awesome - это отлично работает - большое вам спасибо. Это работало так, как было, но это одно и то же общее событие в 9 слайдерах и 9 текстовых окнах, поэтому, если у меня есть две функции, чтобы сделать эту работу, тогда мне легче отлаживать. – chow

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()))