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