2016-04-27 8 views
0

Ich habe ein Panel in WxPython, wo ich eine Schaltfläche enable monitor nehmen möchte und wenn Sie auf eine Schleife der unten starten, aber auch wieder die GUI frei und aktualisieren Sie die Schaltfläche Label auf disable monitor. Sobald Sie auf disable klicken, wird die Schleife vollständig gestoppt.Looping in der GUI

Ich habe mir threading angesehen, aber ich bin mir nicht sicher, ob ich das in diesem Fall tun sollte?

Die gesamte Schleife läuft innerhalb einer def startStop(self) Deklaration und wird innerhalb des wxPanels class ausgeführt.

Ich bin über meinen Kopf hinweg, aber ich habe schon eine Weile mit dieser GUI herumgebastelt und würde es lieben, diese Lektion mit dem richtigen Weg abzuschließen. :)

Pseudo-Code:

while zonesToMonitor != []: 
     time.sleep(int(self.tc_CheckInterval.Value)) 

     j = 0 
     for i in zonesToMonitor: 
      maxVOL = maxVolPerZone[j] 

      urllib.urlopen("http://" + ip_address + ":" + self.tc_serverPort.Value +"/data/rendererData?data=R::" + wx.FindWindowByLabel(i).Label).read() 

      INFO = urllib.urlopen("http://" + ip_address + ":" + self.tc_serverPort.Value +"/data/rendererAction?data=class").read() 

      curTime = datetime.datetime.now() 
      curTime = curTime.strftime("%H:%M") 

      if self.ck_QuietHours.Value == True: 
       quietStartHr = self.tc_quietHr.Value 
       quietEndHr = self.tc_quietHrStop.Value 
       quietVol = self.tc_QuietVol.Value 
       if (curTime > quietStartHr) and (curTime < quietEndHr): 
        print "In quiet hours..." 
        maxVOL = quietVol    

      if self.ck_MuteHours.Value == True: 
       muteStartHr = self.tc_MuteHr.Value 
       muteEndHr = self.tc_MuteHrStop.Value     
       if (curTime > muteStartHr) and (curTime < muteEndHr): 
        print "In mute time..." 
        maxVOL = 0 

      OUTPUT = re.findall('(?<=VOLUME::).*?(?=_\|_)', INFO) 

      if maxVOL == '': 
       maxVOL = 0 

      if OUTPUT == '': 
       OUTPUT = 0 

      OUTPUT = map(int, OUTPUT)    

      if OUTPUT > int(maxVOL): 
       url = "http://" + ip_address + ":" + self.tc_serverPort.Value + "/data/rendererAction?data=VOLUME::" + str(maxVOL) 
       urllib.urlopen(url).read() 

      j += 1 

Antwort

2

i seine glaube nicht, dass eine schlechte Wahl überhaupt diese Art von Aufgabe zu implementieren mit Themen, können Sie mehr über Themen und wxpython hier lesen: Non-Blocking Gui, und auch hier: LongRunningTasks wo der Autor die Alternativen zum Threading mit wxpython diskutiert.

es kann auf folgende Weise erfolgen:

class MyThread(Thread): 
    def __init__(self): 
     Thread.__init__(self) 
     self.ToKill = False 
    def run(self): 
     while True: 
      self.FooHandler() 
      if self.ToKill: 
       return None 
    def FooHandler(self): 
     """ your function here """ 
     print 3 

class Panel(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent, id=-1, style=wx.RAISED_BORDER) 
     Bsizer = wx.BoxSizer(wx.VERTICAL) 
     button=wx.ToggleButton(self, label="Click To Enable") 

     Bsizer.Add(button,1,wx.ALL | wx.EXPAND) 
     self.SetSizer(Bsizer) 
     self.Bind(wx.EVT_TOGGLEBUTTON,self.buttonEvt,id=button.GetId()) 

    def buttonEvt(self, evt): 
     clickedToggleButton = evt.GetEventObject() 
     if clickedToggleButton.GetValue(): 
      self.thread = MyThread() 
      self.thread.start() 
      clickedToggleButton.SetLabel("Click To Disable") 
     else: 
      self.thread.ToKill = True 
      clickedToggleButton.SetLabel("Click To Enable") 
+0

Wow - danke - ich endlich, endlich, verstehen, wie diese Arbeit nach unzähligen Stunden aus dem Internet von Rippen Beispielcode zu machen. Danke, dass du es einfach gehalten hast. :) – chow