我试图以正确的方式关闭我的应用程序,但我可能没有正确地做到这一点,我所拥有的似乎不符合要求。
我有正常的
command = root.destroy
关闭了GUI但我仍然运行了线程,这似乎在Shell的打印中保持明显!
以下是不朽的线程'
def trick(threadName, sleepTime):
while 1 < 2:
field.delete(0, END)
field.insert(0, "Safe Mode")
print "%s" % (threadName)
try:
thread.start_new_thread(trick,("Safe Mode Running", 5))
except: Exception,
print "Safe mode has started"
然后我有其他部分,GUI完成如下所示:
Close = Button(text = "Close", command = root.destroy)
Close.grid(column = 21, row = 0)
root.configure(background='#2b5bce')
root.title("Safe Mode")
root.mainloop()
我哪里错了?
提前谢谢。
P.S。这是伦敦一个阳光灿烂的日子!
答案 0 :(得分:1)
首先,您应该使用threading
模块而不是thread
模块,如the docs中对thread
模块的建议:
注意:线程模块已在Python 3中重命名为_thread.2to3 转换源时,工具会自动调整导入 Python 3; 但是,您应该考虑使用高级
threading
而不是模块。
也就是说,有几种方法可以解决您的问题:
一种是使用threading.Thread
对象并将其设置为daemonic thread:
def trick(threadName, sleepTime):
while 1 < 2:
field.delete(0, END)
field.insert(0, "Safe Mode")
print "%s" % (threadName)
try:
t = threading.Thread(target=trick, args=("Safe Mode Running", 5))
t.daemon = True
t.start()
except: Exception,
print "Safe mode has started"
主线程完成后,守护程序线程将退出。非守护程序线程(这是Python中的默认类型),即使在主线程完成后也会继续运行,并且程序不会退出,直到非守护程序线程自行退出。
第二个选项是使用非守护程序线程,但告诉他们在程序准备好退出时关闭:
exiting = threading.Event()
def trick(threadName, sleepTime):
while 1 < 2:
if exiting.is_set():
return
field.delete(0, END)
field.insert(0, "Safe Mode")
print "%s" % (threadName)
try:
t = threading.Thread(target=trick, args=("Safe Mode Running", 5))
t.daemon = True
t.start()
except: Exception,
print "Safe mode has started"
然后在你的主线程中:
Close = Button(text = "Close", command = root.destroy)
Close.grid(column = 21, row = 0)
root.configure(background='#2b5bce')
root.title("Safe Mode")
root.mainloop()
exiting.set() # Tell the threads to exit
这样做的好处是可以让你优雅地关闭线程。使用daemon=True
将立即终止你的线程,如果他们处于某事的中间(例如写东西或持有一些不会被自动释放的资源),这可能会很糟糕。{{ 1}} docs make a note of this as well:
守护程序线程在关闭时突然停止。他们的资源(如此 作为打开文件,数据库事务等)可能不会被释放 正常。如果你想让你的线程优雅地停止,那就制作它们吧 非守护进程并使用合适的信令机制,如事件。