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