我有这个线程,需要从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 startedn")
self.th1=True
self.t1.start()
def Bit_track_stop(self,gud,con_win):
self.th1=False
con_win.insert(INSERT,"Thread stoppedn")
#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()时出现错误。你能帮我做两件事吗?
- 如何在关闭顶层关闭线程
- 是我的线程实现正确,如果不是,你能纠正我吗?
我试图实现上面的代码,但它是冻结的应用程序。我试图使用连接方法以及使ythe标志作为一个错误,但仍然应用程序冻结。
我需要看到线程关闭。
您的onclosing
方法尝试在设置通知线程停止的标志之前join
线程。
def onclosing(self):
self.t1.join()
self.th1=False
return
如果线程直到self.th1 == False
才停止,并且如果没有其他方法设置self.th1=False
,那么join()
调用将永远不会返回。
你试过改变这两个语句的顺序吗?
def onclosing(self):
self.th1=False
self.t1.join()
return
注意:这正是你可以通过向鸭子解释来解决的问题。