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 25 Python
python实现的jpg格式图片修复代码
Apr 21 Python
PyMongo安装使用笔记
Apr 27 Python
Python实现控制台中的进度条功能代码
Dec 22 Python
python实现log日志的示例代码
Apr 28 Python
Django中celery执行任务结果的保存方法
Jul 12 Python
python自动化测试之DDT数据驱动的实现代码
Jul 23 Python
django框架cookie和session用法实例详解
Dec 10 Python
python实现批量处理将图片粘贴到另一张图片上并保存
Dec 12 Python
教你如何使用Python开发一个钉钉群应答机器人
Jun 21 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 Python
Python first-order-model实现让照片动起来
Jun 25 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 md5下16位和32位的实现代码
2008/04/09 PHP
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
php上传文件常见问题总结
2015/02/03 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
常用PHP封装分页工具类
2017/01/14 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
javascript实现客户端兼容各浏览器创建csv并下载的方法
2015/03/23 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
js实现文字垂直滚动和鼠标悬停效果
2015/12/31 Javascript
分步解析JavaScript实现tab选项卡自动切换功能
2016/01/25 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
浅谈JavaScript中的apply/call/bind和this的使用
2017/02/26 Javascript
jQuery+ajax实现局部刷新的两种方法
2017/06/08 jQuery
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
Nodejs中crypto模块的安全知识讲解
2018/01/03 NodeJs
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
简单实现python数独游戏
2018/03/30 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
中学生期末评语
2014/02/03 职场文书
公司合并协议书范本
2014/09/30 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
修辞手法有哪些?
2019/08/29 职场文书