Python говорит рабочему потоку остановиться - PullRequest
0 голосов
/ 10 июня 2018

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 .Как сделать такой же эффект но умно?

...