wxpython中利用线程防止假死的实现方法


Posted in Python onAugust 11, 2014

前段时间我编写了一个工业控制的软件,在使用中一直存在一个问题,就是当软件检索设备时,因为这个功能执行的时间比较长,导致GUI界面假死,让用户分辨不清楚软件到底仍在执行,还是真的挂掉了。(虽然我设计了同步log显示,但是这个也同样假死了)

程序截图如下:

wxpython中利用线程防止假死的实现方法

代码解析如下:

# -*- coding: utf-8 -*-
 
import time
import wx
from threading import Thread
from wx.lib.pubsub import Publisher

time库用来执行定时函数,模拟需要长时间执行的功能。Publisher用来在线程间传输消息。

class TestThread(Thread):
 def __init__(self):
  #线程实例化时立即启动
  Thread.__init__(self)
  self.start()
 def run(self):
  #线程执行的代码
  for i in range(101):
   time.sleep(0.03)
   wx.CallAfter(Publisher().sendMessage, "update", i)
  time.sleep(0.5)
  wx.CallAfter(Publisher().sendMessage, "update", u"线程结束")

TestThread的__init__函数,定义线程实例化时就启动,run函数就是需要长时间执行的程序。
wx.CallAfter与Publisher().sendMessage用来向GUI发送消息。

class MyForm ( wx.Frame ):
 def __init__( self, parent ):
  wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"Leniy,20140627", pos = wx.DefaultPosition, size = wx.Size( -1,-1 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )
  self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
  gSizer2 = wx.GridSizer( 0, 3, 0, 0 )
  self.m_button2 = wx.Button( self, wx.ID_ANY, u"执行线程", wx.DefaultPosition, wx.DefaultSize, 0 )
  gSizer2.Add( self.m_button2, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 )
  self.m_staticText2 = wx.StaticText( self, wx.ID_ANY, u"MyLabel", wx.DefaultPosition, wx.DefaultSize, 0 )
  self.m_staticText2.Wrap( -1 )
  gSizer2.Add( self.m_staticText2, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 )
  self.m_gauge1 = wx.Gauge( self, wx.ID_ANY, 100, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL )
  self.m_gauge1.SetValue( 0 ) 
  gSizer2.Add( self.m_gauge1, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.ALIGN_CENTER_VERTICAL, 5 )
  self.SetSizer( gSizer2 )
  self.Layout()
  gSizer2.Fit( self )
  self.Centre( wx.BOTH )
  self.m_button2.Bind( wx.EVT_BUTTON, self.onButton )
  Publisher().subscribe(self.updateDisplay, "update")
 def updateDisplay(self, msg):
  t = msg.data
  if isinstance(t, int):#如果是数字,说明线程正在执行,显示数字
   self.m_staticText2.SetLabel("%s%%" % t)
   self.m_gauge1.SetValue( t )
  else:#否则线程未执行,将按钮重新开启
   self.m_staticText2.SetLabel("%s" % t)
   self.m_button2.Enable()
 def onButton( self, event ):
  TestThread()
  self.m_staticText2.SetLabel(u"线程开始")
  event.GetEventObject().Disable()

这个就是GUI的主程序,__init__中使用Publisher().subscribe(self.updateDisplay, “update”)声明了获取线程消息以及显示的方法。

if __name__ == "__main__":
 app = wx.PySimpleApp()
 MyForm(None).Show()
 app.MainLoop()

最后将窗口MyForm(None).Show()显示出来,程序就完成了。

Python 相关文章推荐
python 从远程服务器下载日志文件的程序
Feb 10 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
不可错过的十本Python好书
Jul 06 Python
python opencv检测目标颜色的实例讲解
Apr 02 Python
python斐波那契数列的计算方法
Sep 27 Python
Python实战购物车项目的实现参考
Feb 20 Python
python设计微型小说网站(基于Django+Bootstrap框架)
Jul 08 Python
python标记语句块使用方法总结
Aug 05 Python
python 生成任意形状的凸包图代码
Apr 16 Python
如何把外网python虚拟环境迁移到内网
May 18 Python
python如何查看网页代码
Jun 07 Python
python求解汉诺塔游戏
Jul 09 Python
将图片文件嵌入到wxpython代码中的实现方法
Aug 11 #Python
Python 执行字符串表达式函数(eval exec execfile)
Aug 11 #Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 #Python
Python-基础-入门 简介
Aug 09 #Python
Python入门及进阶笔记 Python 内置函数小结
Aug 09 #Python
Python正则表达式的使用范例详解
Aug 08 #Python
python脚本实现统计日志文件中的ip访问次数代码分享
Aug 06 #Python
You might like
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
spl_autoload_register与autoload的区别详解
2013/06/03 PHP
简单了解WordPress开发中update_option()函数的用法
2016/01/11 PHP
jquery 动态创建元素的方式介绍及应用
2013/04/21 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
jQuery中append()方法用法实例
2014/12/25 Javascript
基于jquery实现轮播焦点图插件
2016/03/31 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
用vue封装插件并发布到npm的方法步骤
2017/10/18 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
vue-router传参用法详解
2019/01/19 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
python使用递归解决全排列数字示例
2014/02/11 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
Python科学画图代码分享
2017/11/29 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
迷你唐卡软皮鞋:Minnetonka Moccasin
2018/05/01 全球购物
英国空调、除湿机和通风设备排名第一:Air Con Centre
2019/02/25 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
大学生实习思想汇报
2014/01/12 职场文书
厂长岗位职责
2014/02/19 职场文书
《寓言两则》教学反思
2014/02/27 职场文书
优秀广告词大全
2014/03/19 职场文书
2014年祖国生日寄语
2014/09/19 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
基于JavaScript实现省市联动效果
2021/06/22 Javascript