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中的readline()方法的使用
May 24 Python
python套接字流重定向实例汇总
Mar 03 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
python+pyqt实现右下角弹出框
Oct 26 Python
python 编写简单网页服务器的实例
Jun 01 Python
python3.4控制用户输入与输出的方法
Oct 17 Python
Python中文编码知识点
Feb 18 Python
Python下简易的单例模式详解
Apr 08 Python
如何实现Django Rest framework版本控制
Jul 25 Python
python中时间转换datetime和pd.to_datetime详析
Aug 11 Python
python怎么判断模块安装完成
Jun 19 Python
如何用Python提取10000份log中的产品信息
Jan 14 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实现的随机广告显示代码
2007/06/14 PHP
php cli 小技巧
2013/06/03 PHP
深入apache配置文件httpd.conf的部分参数说明
2013/06/28 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JS 文字符串转换unicode编码函数
2009/05/30 Javascript
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
简述Python中的面向对象编程的概念
2015/04/27 Python
python web基础之加载静态文件实例
2018/03/20 Python
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
Python使用cx_Freeze库生成msi格式安装文件的方法
2018/07/10 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
给酒店员工的表扬信
2014/01/11 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
报到证办理个人委托书
2014/10/06 职场文书
2015年世界无烟日活动总结
2015/02/10 职场文书
校友回访母校寄语
2015/02/26 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python
MySQL分库分表详情
2021/09/25 MySQL
Python函数对象与闭包函数
2022/04/13 Python