我有一个线程需要从tkinter应用程序的顶层部分调用,但是如果我试图调用self.t1.join(),如下图所示,它会使tkinter应用程序(python)崩溃,你能帮我吗?
class App(Tk):
def __init__(self):
super().__init__()
self.th1=False
####### Thread function --> Bit_Track ##################
def Bit_track(self,gud):
while(self.th1):
*** some code****
if(self.th1==False):
return
######## thread starting ##########
def bit_thread(self,gud,con_win):
self.t1=threading.Thread(target=self.Bit_track,args=(gud,))
con_win.insert(INSERT,"Thread started\n")
self.th1=True
self.t1.start()
def Bit_track_stop(self,gud,con_win):
self.th1=False
con_win.insert(INSERT,"Thread stopped\n")
#self.t1.join()
for i in range(2):
for j in range(31):
gud[i][j].set(0)
#self.t1.join()
print("hello")
###onclosing ####
def onclosing(self):
self.t1.join()
self.th1=False
return
def gui2_create(self):
newWin = Toplevel(self)
bt1=Button(fr3,text="Start",width=10)
bt2=Button(fr3,text="Stop",width=10)
bt1.configure(command=ptr(self.bit_thread,chk_bt_n,con_win))
bt2.configure(command=ptr(self.Bit_track_stop,chk_bt_n,con_win))
(****Here is the problem starting ****)
newWin.protocol("WM_DELETE_WINDOW", self.onclosing)
app = App()
app.mainloop()
正如您在这里看到的,bit_thread正在启动线程,onclosing将在顶层窗口关闭后立即激活。
当self.t1.join()被调用时,错误出现了,因为应用程序正在冻结。你能帮我解决两个问题吗
1.如何在关闭顶层时关闭线程
1.我的线程实现是否正确,如果不正确,您可以更正我吗?
我试图实现上述代码,但它是冻结的应用程序。我试图使用连接方法以及使ythe标志作为afalser,但应用程序仍然冻结。
我要看到三头乐队结束。
1条答案
按热度按时间hxzsmxv21#
您的
onclosing
方法尝试在设置通知线程停止的标志 * 之前 * 执行join
。如果线程直到
self.th1 == False
才停止,并且没有其他方法设置self.th1=False
,那么join()
调用将永远不会返回。你试过调换那两句话的顺序吗?
注意:这正是explaining it to the duck.可以解决的问题