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根据文件大小打log日志
Oct 09 Python
Python标准库06之子进程 (subprocess包) 详解
Dec 07 Python
浅谈pandas中shift和diff函数关系
Apr 08 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
Python编写打字训练小程序
Sep 26 Python
Python requests获取网页常用方法解析
Feb 20 Python
基于打开pycharm有带图片md文件卡死问题的解决
Apr 24 Python
python TCP包注入方式
May 05 Python
基于python实现检索标记敏感词并输出
May 07 Python
Django限制API访问频率常用方法解析
Oct 12 Python
python使用torch随机初始化参数
Mar 22 Python
Python+Tkinter制作专属图形化界面
Apr 01 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
php之Memcache学习笔记
2013/06/17 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
javascript 页面只自动刷新一次
2009/07/10 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
jsMind通过鼠标拖拽的方式调整节点位置
2015/04/13 Javascript
javascript中createElement的两种创建方式
2015/05/14 Javascript
jquery获得当前html页面源码的方法
2015/07/14 Javascript
Query常用DIV操作获取和设置长度宽度的实现方法
2016/09/19 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
js实现数组去重方法及效率?Ρ? target=
2017/02/14 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
JavaScript实现轮播图特效
2020/04/10 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
vue的$http的get请求要加上params操作
2020/11/12 Javascript
初步剖析C语言编程中的结构体
2016/01/16 Python
Python使用Beautiful Soup包编写爬虫时的一些关键点
2016/01/20 Python
Python及Django框架生成二维码的方法分析
2018/01/31 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
如何在 Django 模板中输出 "{{"
2020/01/24 Python
Spring Boot中使用IntelliJ IDEA插件EasyCode一键生成代码详细方法
2020/03/20 Python
django使用JWT保存用户登录信息
2020/04/22 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
英国轻奢珠宝品牌:Astley Clarke
2016/12/18 全球购物
幼儿园中班新学期寄语
2014/01/18 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
吨的认识教学反思
2014/04/27 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
导游词之镇江焦山
2019/11/21 职场文书