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 布尔操作实现代码
Mar 23 Python
python计数排序和基数排序算法实例
Apr 25 Python
Python3.x版本中新的字符串格式化方法
Apr 24 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
Python使用LDAP做用户认证的方法
Jun 20 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
Python合并多张图片成PDF
Jun 09 Python
Python下opencv使用hough变换检测直线与圆
Jun 18 Python
Python中的套接字编程是什么?
Jun 21 Python
python面向对象版学生信息管理系统
Jun 24 Python
Python超详细分步解析随机漫步
Mar 17 Python
用PYTHON去计算88键钢琴的琴键频率和音高
Apr 10 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中error_reporting函数用法详细介绍
2017/06/11 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
JavaScript 学习笔记(七)字符串的连接
2009/12/31 Javascript
javascript suggest效果 自动完成实现代码分享
2012/02/17 Javascript
JavaScript 基础篇(一)
2012/03/30 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
理解javascript模块化
2016/03/28 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
js重写方法的简单实现
2016/07/10 Javascript
vue实现计步器功能
2019/11/01 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
解决vue里a标签值解析变量,跳转页面,前面加默认域名端口的问题
2020/07/22 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
python实现的简单FTP上传下载文件实例
2015/06/30 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
python中的数据结构比较
2019/05/13 Python
分析运行中的 Python 进程详细解析
2019/06/22 Python
python创建子类的方法分析
2019/11/28 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
2020/11/24 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
美国领先的礼品卡网站:GiftCards.com
2016/11/02 全球购物
Pretty Little Thing爱尔兰:时尚女性服饰
2017/03/27 全球购物
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
外包公司软件测试工程师
2014/11/01 面试题
大专计算机个人求职的自我评价
2013/10/21 职场文书
女子职高个人自荐书
2014/02/01 职场文书
战友聚会策划方案
2014/06/13 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
Vue图片裁剪组件实例代码
2021/07/02 Vue.js
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL