Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中停止线程?_Python_Multithreading_Tkinter - Fatal编程技术网

如何在python中停止线程?

如何在python中停止线程?,python,multithreading,tkinter,Python,Multithreading,Tkinter,我是Python的初学者。 我使用Tkinter编码。我想用扩展名“线程化”来改进我的程序。 但是,在我的一些程序中,如果我离开Tkinter窗口,程序仍在运行。 我想知道如何阻止它。我猜是线还在走。我尝试了不同的方法来关闭线程,但我发现唯一的问题是创建一个错误(根据我的说法,这不是一个好的解决方案):) 我想知道是否存在类似以下指令的指令来停止线程 Thread(target=FinTemps).stop() (我知道“停止”不起作用) 如果可以通过“while”循环停止线程,我尝试了这个方

我是Python的初学者。 我使用Tkinter编码。我想用扩展名“线程化”来改进我的程序。 但是,在我的一些程序中,如果我离开Tkinter窗口,程序仍在运行。 我想知道如何阻止它。我猜是线还在走。我尝试了不同的方法来关闭线程,但我发现唯一的问题是创建一个错误(根据我的说法,这不是一个好的解决方案):)

我想知道是否存在类似以下指令的指令来停止线程

Thread(target=FinTemps).stop()
(我知道“停止”不起作用)

如果可以通过“while”
循环停止线程,我尝试了这个方法,但我不明白为什么它不起作用:

import tkinter as tk
from threading import Thread as Th
from time import *

global end
end=False

begining=time()

def screen():
    global end
    while end==False:
        chrono=time()-beginning
        if chrono<5:
            sentence.set("Hey !")
        elif chrono<8:
            sentence.set("What's up ?")

window=tk.Tk()
window.geometry("{}x{}".format(fenêtre.winfo_screenwidth(), window.winfo_screenheight()))
window.title("Test Tkinter & Thread")

sentence=tk.StringVar()
sentence.set("none")
GreatTitle=tk.Label(window, textvariable=sentence, width=500)

Th(target=screen).start()

GreatTitle.pack(expand=1)

window.mainloop()

end=True
将tkinter作为tk导入
从线程导入线程作为
不定期进口*
全球终端
结束=错误
开始=时间()
def屏幕():
全球终端
当end==False时:
chrono=时间()-开始

如果chrono可能是您的while循环检查
end
过于频繁,在根窗口被破坏后,当您尝试将
end
设置为True时,可能会导致争用情况

您可以尝试在while循环中添加短暂睡眠,以减少出现竞速情况的可能性:

而end==False:
...
睡眠(0.1)

您正在做的事情不安全
tkinter
不是线程安全的,运行任何
tkinter
API跨线程都可能导致各种类型的损坏

好的一面是,这里不需要线。在真正的代码中,您根本不会使用线程,您只需将更改安排在
tkinter
的事件循环上,将代码简化为:

import tkinter as tk

window=tk.Tk()
window.geometry("{}x{}".format(window.winfo_screenwidth(), window.winfo_screenheight()))
window.title("Test Tkinter & Thread")

sentence=tk.StringVar()
sentence.set("none")
GreatTitle=tk.Label(window, textvariable=sentence, width=500)

GreatTitle.pack(expand=1)

window.after(0, sentence.set, "Hey !")        # Happens almost immediately, as in thread case
window.after(5000, sentence.set, "What's up ?")  # Delays five seconds, as in thread case
window.mainloop()

这也远比你所拥有的更有效率;如前所述,线程将永远旋转,在允许的时间内不间断地不断循环,使核心始终以100%的速度运行;GUI本身的运行速度会变慢,因为当另一个线程持有GIL时,它无法完成大部分工作。使用
.after
,除了事件触发和
语句更新之外,任何时候都不会消耗任何有意义的资源。

这是否回答了您的问题@funie200:根据OP的要求,是的,是重复的。但这是肯定的,这个解决办法与停止一个线程无关,所以我不认为它是一个复制品。