2016-04-27 4 views
0

У меня есть панель в wxPython, где я хочу взять кнопку enable monitor, и при нажатии на нее запустите цикл ниже, но снова освободите GUI и, таким образом, обновите ярлык кнопки до disable monitor. Как только щелчок disable, он полностью остановит цикл.Looping in the GUI

Я просмотрел threading, но я не уверен, что это то, что я должен делать в этом случае?

Весь цикл работает в пределах def startStop(self) декларации и выполняется в пределах class wxPanel.

Я нахожусь над моей головой, но я уже давно занимаюсь этим графическим интерфейсом и хотел бы завершить этот урок, сделав это правильно. :)

Псевдо код:

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 

ответ

2

я не думаю, что его плохой выбор вообще реализовать такую ​​задачу нитками, вы можете прочитать больше о потоках и WxPython здесь: Non-Blocking Gui, а также здесь: LongRunningTasks, где автор обсуждает альтернативы потоку с помощью wxpython.

это может быть сделано следующим образом:

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 - спасибо - я наконец-то, наконец, понять, как сделать эту работу после бесчисленных часов разрывая образец кода от Интернета. Спасибо, что поддержали его просто. :) – chow