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进程管理工具supervisor使用实例
Sep 17 Python
python分析nignx访问日志脚本分享
Feb 26 Python
python修改字典内key对应值的方法
Jul 11 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
python用列表生成式写嵌套循环的方法
Nov 08 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 Python
Python八皇后问题解答过程详解
Jul 29 Python
django框架auth模块用法实例详解
Dec 10 Python
python序列类型种类详解
Feb 26 Python
Python configparser模块操作代码实例
Jun 08 Python
python PIL模块的基本使用
Sep 29 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中0,null,empty,空,false,字符串关系的详细介绍
2013/06/20 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
飞鱼(shqlsl) javascript作品集
2006/12/16 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
JS中判断JSON数据是否存在某字段的方法
2014/03/07 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
JavaScript如何禁止Backspace键
2015/12/02 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
2016/11/01 Javascript
详解webpack3如何正确引用并使用jQuery库
2017/08/26 jQuery
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
jquery css实现流程进度条
2020/03/26 jQuery
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
在Python中定义和使用抽象类的方法
2016/06/30 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
Python基于sklearn库的分类算法简单应用示例
2018/07/09 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
基于 HTML5 WebGL 实现的垃圾分类系统
2019/10/08 HTML / CSS
办护照工作证明范本
2014/01/14 职场文书
开学季活动策划方案
2014/02/28 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
房产公证书格式
2015/01/26 职场文书
pytorch中的model=model.to(device)使用说明
2021/05/24 Python
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
Python常用配置文件ini、json、yaml读写总结
2021/07/09 Python
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers