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装饰器
May 09 Python
详解Python中的条件判断语句
May 14 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
基于python socketserver框架全面解析
Sep 21 Python
Python基于Tkinter模块实现的弹球小游戏
Dec 27 Python
python实现植物大战僵尸游戏实例代码
Jun 10 Python
python绘图模块matplotlib示例详解
Jul 26 Python
django 中使用DateTime常用的时间查询方式
Dec 03 Python
Python3 虚拟开发环境搭建过程(图文详解)
Jan 06 Python
基于Python实现人脸自动戴口罩系统
Feb 06 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
Jun 26 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将向Java靠拢
2006/10/09 PHP
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
php zip文件解压类代码
2009/12/02 PHP
PHP 反向排序和随机排序代码
2010/06/30 PHP
PHP数组的交集array_intersect(),array_intersect_assoc(),array_inter_key()函数的小问题
2011/05/29 PHP
php数组键名技巧小结
2015/02/17 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
jquery简单实现鼠标经过导航条改变背景图
2013/12/17 Javascript
把字符串按照特定的字母顺序进行排序的js代码
2014/01/28 Javascript
jquery实现点击变换导航样式的方法
2015/08/31 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
Angular 2.0+ 的数据绑定的实现示例
2017/08/09 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
2017/09/05 jQuery
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
如何在JavaScript中等分数组的实现
2020/12/13 Javascript
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
[01:09]DOTA2次级职业联赛 - 99战队宣传片
2014/12/01 DOTA
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
python+selenium实现自动抢票功能实例代码
2018/11/23 Python
详解python持久化文件读写
2019/04/06 Python
Python3.0中普通方法、类方法和静态方法的比较
2019/05/03 Python
Python类中的魔法方法之 __slots__原理解析
2019/08/26 Python
基于python+selenium的二次封装的实现
2020/01/06 Python
linux 下selenium chrome使用详解
2020/04/02 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
超市开店计划书
2014/09/15 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书