博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wxPython,线程中修改UI的方法
阅读量:7079 次
发布时间:2019-06-28

本文共 1080 字,大约阅读时间需要 3 分钟。

hot3.png

wxPython中,启用多线程,线程中需要修改UI方法,要使用wx.CallAfter+PubSub向主线程发送消息,主线程中,使用Publisher().subscribe接受消息,并进行处理。代码如下:

多线程中发送消息:

#发送事件,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)

通过查看源代码发现,sendMessage方法第二个参数应该传个字典类型(**kwargs)。部分文章使用的版本比老,直接传递了普通的参数,没有用字典的形式传递参数,应该改为wx.CallAfter(pub.sendMessage,"update",msg="Threadfinished!")。此处应该可以传递一个字典,通过字典传递多个参数给UI线程。不过我没试验。

部分方案参考:https://www.cnblogs.com/hhudaqiang/p/6548560.html

转载于:https://my.oschina.net/u/2396236/blog/1616148

你可能感兴趣的文章
Dockerfile制作LAMP
查看>>
sublime text3安装及配置
查看>>
gitignore配置
查看>>
dell远程控制卡iDRAC如何重启?
查看>>
Mybatis-Plus 真好用(乡村爱情加持)
查看>>
信用卡相关
查看>>
Koa (koajs) 基于 Node.js 平台的下一代 web 开发框架
查看>>
ext表格grid----重写applySort方法,使支持按中文首字母排序
查看>>
mybatis分页插件和类型
查看>>
linux系统下安装 Loadrunner11
查看>>
system 函数被废除的替代方法
查看>>
使用git命令提取两次提交之间的差异文件
查看>>
今天的事
查看>>
node.js REPL
查看>>
面试问题
查看>>
dhcp在企业网中的应用(案例)
查看>>
nginx(7):使用nginx的proxy_cache做网站缓存
查看>>
C++ explicit
查看>>
AngularJS内置指令
查看>>
冒泡排序算法分析
查看>>