wxpythonのwx.CallAfter
wxpythonのwx.Timer - メグタンの何でもブログ の続き
他のスレッドからGUI操作する時の wx.CallAfter
wx.CallAfterは処理をメインスレッド(GUIスレッド)のキューに登録して実行してくれる関数です。
他のスレッドからGUIの部品操作を行う時に使用する事が出来ます。
def m_button1OnButtonClick( self, event ): if self.thread.is_alive() == True: self.threadStop = True #スレッドを終了させる self.thread.join() #スレッドの終了を待つ else: self.thread = th.Thread(target=self.worker, daemon=True) self.thread.start()
self.thread = th.Thread(target=self.worker, daemon=True) self.threadStop = True def update(self, data): print('id: {0}'.format(th.get_ident())) #スレッドの確認(UIスレッド) self.m_gauge1.SetValue(data) def worker(self): print('id: {0}'.format(th.get_ident())) #スレッドの確認 self.threadStop = False for i in range(0,100,1): if self.threadStop == True: break time.sleep(0.5) # ここで時間の掛かる処理 wx.CallAfter(self.update,i) # GUI操作はメインスレッドから呼び出す (MainLoop内で呼び出される)
wx.CallAfterが実行されると、メインスレッドでupdateが実行されるまでサブのスレッドは停止する事になります。
実行されているスレッドを確認するには
import threading as th print('id: {0}'.format(th.get_ident()))
wx.CallAfter
wx Functions — wxPython Phoenix 4.2.0 documentation