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搜索指定目录的方法
Apr 29 Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
python脚本爬取字体文件的实现方法
Apr 29 Python
Python中pandas dataframe删除一行或一列:drop函数详解
Jul 03 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
django实现用户注册实例讲解
Oct 30 Python
打包PyQt5应用时的注意事项
Feb 14 Python
pandas DataFrame运算的实现
Jun 14 Python
Python爬虫后获取重定向url的两种方法
Jan 19 Python
python中用ggplot绘制画图实例讲解
Jan 26 Python
python 多线程爬取壁纸网站的示例
Feb 20 Python
python 实现德洛内三角剖分的操作
Apr 22 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
基于empty函数的判断详解
2013/06/17 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
如何在HTML 中嵌入 PHP 代码
2015/05/13 PHP
PHP MSSQL 分页实例
2016/04/13 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
如何使用JS在HTML中自定义字符串格式化
2017/07/20 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
浅谈webpack-dev-server的配置和使用
2018/05/17 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
python中getaddrinfo()基本用法实例分析
2015/06/28 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
使用Python Pandas处理亿级数据的方法
2019/06/24 Python
Python算法中的时间复杂度问题
2019/11/19 Python
python 获取谷歌浏览器保存的密码
2021/01/06 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
详解如何用HTML5 Canvas API控制图片的缩放变换
2016/03/22 HTML / CSS
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
美国汽配连锁巨头Pep Boys官网:轮胎更换、汽车维修服务和汽车零部件
2017/01/14 全球购物
介绍一下Ruby中的对象,属性和方法
2012/07/11 面试题
求职信内容怎么写
2014/05/26 职场文书
安全宣传标语
2014/06/10 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
创业不要错过,这4种餐饮新模式
2019/07/18 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
PHP设计模式(观察者模式)
2021/07/07 PHP
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android