Я пишу функциональный, а не классовый код, потому что мои приложения представляют собой простые электромеханические формы управления. Я использую tkinter GUI для управления серией из 4-х ступенчатых двигателей вращения и по модулю для определения следующего шага. Вы вводите количество циклов, которое хотите запустить двигатели, и нажимаете go. Они go CW, CCW для 'N' шагов, пока счетчик не достигнет числа циклов. Я наблюдаю за кнопкой отмены и использую root .updateidletasks (), чтобы проверить, была ли нажата кнопка отмены, предотвращающая блокировку кода запуска двигателя.
Вот пример кода tkinter:
while ((StepCounter < steps) and (stop == False)):
pin = StepCounter % 4
if(direction == True):
if pin == 0:
Step1()
time.sleep(StepTime)
elif pin == 1:
Step2()
time.sleep(StepTime)
elif pin == 2:
Step3()
time.sleep(StepTime)
elif pin == 3:
Step4()
time.sleep(StepTime)
if(direction == False):
if pin == 0:
Step3()
time.sleep(StepTime)
elif pin == 1:
Step2()
time.sleep(StepTime)
elif pin == 2:
Step1()
time.sleep(StepTime)
elif pin == 3:
Step4()
time.sleep(StepTime)
root.update_idletasks()
root.update()
if stop == True:
StopALL()
break;
StepCounter += 1
Что эквивалентно updateidletasks () в wx. python
Рольф - так я и думал. У меня есть кнопка, которая переворачивает флаг с ложного на истинное. вот l oop, который блокирует. Я уверен, что в моей логике c есть что-то действительно глупое, чего я не вижу.
def run(event):
count = 0
abort = False
rl = ctrl_txt_rl.GetValue()
print ('Abort button state = ', haltBtn.GetValue())
while count < int(rl) and (abort == False):
count = count
print ("Count = ", count)
#do some stuff
time.sleep(1)
count = count + 1
print ("Run Stopped")
return
OK Проблема решена. Я добавил вызов wx.Yield () в l oop, который обновляет GUI и фиксирует нажатие кнопки. Довольно прямая корреляция с updateidletasks в tkinter, которая ломает время l oop. Для меня это выглядит проще, чем многопоточность, поскольку мое приложение довольно простое.
count = 0
abort = False
rl = ctrl_txt_rl.GetValue()
print ('Abort button state = ', haltBtn.GetValue())
while count < int(rl) and haltBtn.GetValue() == False:
count = count
print ("Count = ", count)
print ('Abort button state = ', haltBtn.GetValue())
time.sleep(1)
wx.Yield()
count +=1
Спасибо