2016-04-24 15 views
0

Zugegeben, ich habe eine harte Zeit mit objektorientierten Dingen. Also verstehe ich die self Deklarationen nicht überall. Das heißt, ich habe ein Panel mit einer Anzahl der gleichen Arten von Widgets.Wie übergebe ich ein wxWidget an eine generische Funktion?

Gibt es eine Möglichkeit, eine generische Funktion ein Widget als Argument zu erhalten?

Ich mag die Funktion am unteren Argument aus den self.Bind erhalten, und zwar kann ich passieren self.sliderZone1 und self.tc_ZONEVOL1 in die def?

würde Ich mag die def slider1Update so etwas wie folgt aussehen:

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

Ist das möglich?

Psuedo-Code:

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

Ich habe nicht ganz die Energie, um eine vollständige Antwort zu schreiben, aber überprüfe [diese Antwort] (http://stackoverflow.com/questions/173687/is-it-possible-to-pass- Argumente-in-Event-Bindungen) für die Übergabe von Argumenten an Ereignisbindungen. Du wirst eine Lambda-Funktion brauchen. – dpwilson

Antwort

1

Eigentlich gibt es keine Notwendigkeit, die in weitergeben, wenn man sie Klassenvariablen zu machen, das ist, was die self. Mittel. Die Art und Weise haben Sie es zur Zeit sollte gut codiert arbeiten:

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

Das ist eigentlich die übliche Art und Weise zu tun, was Sie tun mögen. Aber wenn man sie übergeben wollen, würden Sie so etwas tun:

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) 

Dann wird Ihr Event-Handler die gleiche Art und Weise aussehen würden Sie erwähnt:

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

Dieses auf dem WxPython Wiki hier abgedeckt:

es tatsächlich erwähnt eine andere gute Möglichkeit, dies zu tun mit functools.partial, die Sie vielleicht auch mögen.

+0

Super - das funktioniert super - vielen Dank. Es funktionierte so, wie es war, aber es ist das gleiche generische Ereignis über 9 Schieberegler und 9 Textctrls. Wenn ich also zwei Funktionen haben kann, ist es einfacher für mich zu debuggen. – chow

0

Um das Objekt zu erhalten, die das Ereignis ausgelöst hat, können Sie auch event.GetObject() verwenden, etwa so:

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

Die wx.EVT_SLIDER Veranstaltung trägt auch den Wert, so dass Sie auch, dass verwenden können.

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