def On_RunFor(self, event, idx): global device cHrs = self.widgets[idx].timerText.GetLabel()[:3] cMin = self.widgets[idx].timerText.GetLabel()[4:6] cSec = self.widgets[idx].timerText.GetLabel()[7:9] runForBox = GUI3.RunForDialog(self, cHrs, cMin, cSec) runForBox.ShowModal() if runForBox.cancelled: return else: runForSeconds = runForBox.hours.GetValue( ) * 2400 + runForBox.minutes.GetValue( ) * 60 + runForBox.seconds.GetValue() timer = [] timer.append(runForBox.seconds.GetValue()) timer.append(runForBox.minutes.GetValue()) timer.append(runForBox.hours.GetValue()) timeFormat = "{0:03}:{1:02}:{2:02}".format( runForBox.hours.GetValue(), runForBox.minutes.GetValue(), runForBox.seconds.GetValue()) self.widgets[idx].timerText.SetLabel(timeFormat) self.widgets[idx].timerText.Enable(True) self.widgets[idx].progressBar.SetRange(PROGRESS_PRECISION) self.widgets[idx].progressBar.SetValue(0) def decTimer(): timer[0] -= 1 if timer[0] < 0: timer[1] -= 1 timer[0] = 59 if timer[1] < 0: timer[2] -= 1 timer[1] = 59 timer[0] = 59 if timer[2] < 0: timer[2] = 0 timer[1] = 0 timer[0] = 0 timeFormat = "{0:03}:{1:02}:{2:02}".format( timer[2], timer[1], timer[0]) self.widgets[idx].timerText.SetLabel(timeFormat) def incGauge(): newVal = self.widgets[idx].progressBar.GetValue() + 1 self.widgets[idx].progressBar.SetValue(newVal) self.widgets[idx].progressTimers = [] self.widgets[idx].progressTimers.append( RepeatTimer.Timer(1, True, decTimer)) for n in range(logger.options["progress_precision"] - 1): self.widgets[idx].progressTimers.append( threading.Timer( (n + 1) * (float(runForSeconds) / logger.options["progress_precision"]), incGauge)) def onStop(): # TODO is GUI still alive??? self.widgets[idx].timerText.Enable(False) for t in self.widgets[idx].progressTimers: t.cancel() self.progressTimers = [] self.widgets[idx].runForTimer = None self.widgets[idx].progressBar.SetRange(100) self.widgets[idx].progressBar.SetValue(100) device.channels[idx].stop() self.widgets[idx].runForTimer = threading.Timer( runForSeconds, onStop)