Tkinter работает в основном потоке, в то время как в рабочем потоке выполняется процесс.В окне Tkinter, если пользователь нажимает кнопку «STOP», рабочий должен остановиться.
Я использую цикл while и по какой-то причине он не работает.
Пожалуйста, проверьтекод ниже.
from threading import Thread
import time
import Tkinter as tk
class status:
STOP = False
def stop():
print 'User request to STOP the work'
status.STOP = True
def worker():
print 'worker starts'
while not status.STOP:
for i in xrange(10):
print i
time.sleep(1)
print 'worker finishes'
if status.STOP:
print 'worker was interrupted'
# wrapping stuff up.....
else:
print 'worker finished without interruption'
if __name__ == '__main__':
root = tk.Tk()
tk.Button(root, text="STOP", command=stop).pack()
Thread(target=worker).start()
root.mainloop()
Редактировать 1: Я думаю, я знаю, почему это не работает.Если я правильно понимаю, условие в цикле , в то время как проверяется после прохождения всего цикла.Тем не менее, я до сих пор не знаю, как мне справиться с этой ситуацией.
Edit 2: @smoggers, ответ (поместив if status.STOP in the
для i в цикле xrange (10) `)технически работают, но что, если рабочий процесс намного сложнее?
См. ниже код для новой функции 'worker':
def worker():
print 'worker starts'
while not status.STOP:
for i in xrange(10):
print i
time.sleep(1)
print 'do some complex stuff'
time.sleep(1)
print 'do more complex stuff'
time.sleep(1)
print 'worker finishes'
if status.STOP:
print 'worker was interrupted'
# wrapping stuff up.....
else:
print 'worker finished without interruption'
Я бы хотел, чтобы он мог проверять статус , в то время как выполняет каждую строку кода.Глупый непрограммирующий способ решить эту проблему - поместить if status.STOP: break
в каждую строку кода в цикле for .Как сделать такой же эффект но умно?