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