在 GUI 中循环
Looping in the GUI
我在 wxPython 中有一个面板,我想在其中放置一个按钮 enable monitor
并在单击时启动下面的循环,同时再次释放 GUI,从而将按钮标签更新为 disable monitor
.单击 disable
后,它将完全停止循环。
我看过 threading
,但我不确定在这种情况下我应该这样做吗?
整个循环 运行 在 def startStop(self)
声明中并且 运行 在 wxPanel 的 class
.
中
我有点不知所措,但我已经修改这个 GUI 有一段时间了,我很乐意以正确的方式完成本课。 :)
伪代码:
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
我认为用线程实现这种任务一点也不糟糕,您可以在此处阅读有关线程和 wxpython 的更多信息:Non-Blocking Gui, and also here: 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")
我在 wxPython 中有一个面板,我想在其中放置一个按钮 enable monitor
并在单击时启动下面的循环,同时再次释放 GUI,从而将按钮标签更新为 disable monitor
.单击 disable
后,它将完全停止循环。
我看过 threading
,但我不确定在这种情况下我应该这样做吗?
整个循环 运行 在 def startStop(self)
声明中并且 运行 在 wxPanel 的 class
.
我有点不知所措,但我已经修改这个 GUI 有一段时间了,我很乐意以正确的方式完成本课。 :)
伪代码:
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
我认为用线程实现这种任务一点也不糟糕,您可以在此处阅读有关线程和 wxpython 的更多信息:Non-Blocking Gui, and also here: 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")