wxPython中,啓用多線程,線程中須要修改UI方法,要使用wx.CallAfter+PubSub向主線程發送消息,主線程中,使用Publisher().subscribe接受消息,並進行處理。代碼以下:
多線程中發送消息:html
#發送事件,msg爲傳遞的參數 #假如不須要傳遞參數後面無需加msg參數 wx.CallAfter(pub.sendMessage, "update",msg ='something')
在窗體初始化的語句中,進行註冊接收:多線程
#註冊 pub.subscribe(self.updateHandle, "update") #處理的方法 msg爲線程中傳遞的參數,假如線程中沒有傳遞參數,方法不須要加msg參數 def updateHandle(self,msg): id = msg #部分文章寫的是:msg.data,不過我試了,直接接收msg就好了
可能出現的問題:
1.ImportError: cannot import name Publisher線程
出現這個錯誤是正常的,咱們進入wx.lib.pubsub這個模塊發現並無Publisher這個類,可是咱們在wx.lib.pubsub這個模塊下面的pub模塊發現了Publisher的影子,原來在2.8版本時已經將這個類私有化了,見126行,_publisher = _Publisher(),同時將Publisher的subscribe與sendMessage複製給了subscribe與sendMessage變量見(128,131)行。因此咱們這樣引入頭:from wx.lib.pubsub import pub,同時將全部的Publisher()改成pub。
2.TypeError: sendMessage() takes exactly 2 arguments (3 given)code
經過查看源代碼發現,sendMessage方法第二個參數應該傳個字典類型(**kwargs)。部分文章使用的版本比老,直接傳遞了普通的參數,沒有用字典的形式傳遞參數,應該改成wx.CallAfter(pub.sendMessage,"update",msg="Threadfinished!")。此處應該能夠傳遞一個字典,經過字典傳遞多個參數給UI線程。不過我沒試驗。htm
部分方案參考:https://www.cnblogs.com/hhudaqiang/p/6548560.htmlblog