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构造icmp echo请求和实现网络探测器功能代码分享
Jan 10 Python
Python脚本处理空格的方法
Aug 08 Python
Python实现一个转存纯真IP数据库的脚本分享
May 21 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
Jul 06 Python
django开发post接口简单案例,获取参数值的方法
Dec 11 Python
Python数据类型之Set集合实例详解
May 07 Python
Python进度条的制作代码实例
Aug 31 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
opencv之颜色过滤只留下图片中的红色区域操作
Jun 05 Python
Python 多进程、多线程效率对比
Nov 19 Python
Django如何重置migration的几种情景
Feb 24 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 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中加密解密函数与DES加密解密实例
2014/10/17 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
JS 面向对象的5钟写法
2009/07/31 Javascript
Package.js  现代化的JavaScript项目make工具
2012/05/23 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
几行js代码实现自适应
2017/02/24 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
基于构造函数的五种继承方法小结
2017/07/27 Javascript
从对象列表中获取一个对象的方法,依据关键字和值
2017/09/20 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
[04:44]DOTA2西游记战队视频彩蛋流出 师徒开黑巧遇林书豪
2016/08/03 DOTA
Python中的rfind()方法使用详解
2015/05/19 Python
python自带的http模块详解
2016/11/06 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
Python 查看list中是否含有某元素的方法
2018/06/27 Python
python list格式数据excel导出方法
2018/10/31 Python
django解决跨域请求的问题
2018/11/11 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
Python pip使用超时问题解决方案
2020/08/03 Python
DRF使用simple JWT身份验证的实现
2021/01/14 Python
HTML5对比HTML4的主要改变和改进总结
2016/05/27 HTML / CSS
在线吉他课程,学习如何弹吉他:Fender Play
2019/02/28 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
什么是属性访问器
2015/10/26 面试题
专业销售业务员求职信
2013/11/18 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
个人欠款担保书
2014/05/20 职场文书
搞笑结婚保证书
2015/05/08 职场文书
我是特种兵观后感
2015/06/11 职场文书