tKinter多线程停止线程

时间:2017-04-18 22:41:13

标签: python multithreading tkinter python-multithreading

我用简单的例子创建了一个带有tKinter的Python GUI我有一个按钮,触发一个简单的循环,增加一个计数器。我已经成功地对计数器进行了线程化,因此我的GUI不会冻结,但是我遇到了让它停止计数的问题。这是我的代码:

# threading_example.py
import threading
from threading import Event
import time
from tkinter import Tk, Button


root = Tk()

class Control(object):

    def __init__(self):
        self.my_thread = None
        self.stopThread = False

    def just_wait(self):
        while not self.stopThread:
            for i in range(10000):
                time.sleep(1)
                print(i)

    def button_callback(self):
        self.my_thread = threading.Thread(target=self.just_wait)
        self.my_thread.start()

    def button_callbackStop(self):
        self.stopThread = True
        self.my_thread.join()
        self.my_thread = None


control = Control()
button = Button(root, text='Run long thread.', command=control.button_callback)
button.pack()
button2 = Button(root, text='stop long thread.', command=control.button_callbackStop)
button2.pack()


root.mainloop()

如何安全地使计数器停止递增并正常关闭线程?

2 个答案:

答案 0 :(得分:2)

所以你想要一个for循环和一个while循环并行运行?好吧,他们不能。正如你所拥有的那样,for循环正在运行,并且不会注意while循环条件。

您只需要制作一个循环。如果你希望你的线程在10000次循环后自动终止,你可以这样做:

def just_wait(self):
    for i in range(10000):
        if self.stopThread:
            break # early termination
        time.sleep(1)
        print(i)

答案 1 :(得分:1)

您必须在self.stopThread循环

中检查for