Thread.join()在python的tkinter中崩溃

zzlelutf  于 2023-01-11  发布在  Python
关注(0)|答案(1)|浏览(184)

我有一个线程需要从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,但应用程序仍然冻结。
我要看到三头乐队结束。

hxzsmxv2

hxzsmxv21#

您的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

注意:这正是explaining it to the duck.可以解决的问题

相关问题