目前我正在开发一个在PyQt.
此GUI的功能包含多个线程。我认为这就是我只需点击窗口一角的红色x的原因。
它没有完全关闭过程(尽管GUI的视觉方面消失了)。
有没有办法可以将主窗口中的x链接到一个停止所有线程的关闭函数?
我是PyQt
的新手,所以对我很轻松! (另外,我相信我的所有线程都是Python线程,而不是Qthreads)
答案 0 :(得分:0)
您可以在启动线程之前将Thread
对象上的daemon
标志设置为True
。如documentation中所述:
线程可以标记为“守护程序线程”。这个的意义 flag是只有守护进程线程时整个Python程序退出 离开了。初始值继承自创建线程。该 flag可以通过
daemon
属性设置。
值得注意的是,这有潜在危险,具体取决于您的后台线程正在做什么(再次引用documentation):
守护程序线程在关闭时突然停止。他们的资源(如此 作为打开文件,数据库事务等)可能不会被释放 正常。如果你想让你的线程优雅地停止,那就制作它们吧 非守护进程并使用合适的信令机制,例如
Event
。
实现正常关闭的方式在某种程度上取决于线程代码的实现方式,但它看起来像这样:
线程方法:
def threaded_method(event, ...):
while True:
if event.is_set()
# clean up
return
# Normal stuff it does goes here.
主线程:
def on_exit(): # called when X in main window pressed
event.set() # Tell threads to cleanup.
# Do normal exit stuff.
if __name__ == "__main__":
event = threading.Event()
t = threading.Thread(target=threaded_method, args=(event, ...))
#t.daemon = True # Assuming you don't care about gracefully stopping the threads, you can just do this and leave out the Event stuff.
t.start()
# other stuff
请注意,如果您的程序退出时线程中的循环阻塞某些内容(例如从子进程获取数据),则此方法可能无法正常工作。如果是这种情况,请告诉我,我可以修改我的答案来解决这个问题。