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实现根据指定端口探测服务器/模块部署的方法
Aug 25 Python
在Python中使用zlib模块进行数据压缩的教程
Jun 26 Python
Python Sql数据库增删改查操作简单封装
Apr 18 Python
听歌识曲--用python实现一个音乐检索器的功能
Nov 15 Python
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
Python标准库sched模块使用指南
Jul 06 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
Django的Modelforms用法简介
Jul 27 Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
什么是python的列表推导式
May 26 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
May 20 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多文件上传实现代码
2014/02/20 PHP
通过php添加xml文档内容的方法
2015/01/23 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
PDO::query讲解
2019/01/29 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
JQuery魔力之$("tagName")与selector
2012/03/05 Javascript
解析DHTML,JavaScript,DOM,BOM以及WEB标准的描述
2013/06/19 Javascript
js读取cookie方法总结
2014/10/31 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
JavaScript列表框listbox全选和反选的实现方法
2015/03/18 Javascript
JS简单实现动画弹出层效果
2015/05/05 Javascript
总结Node.js中的一些错误类型
2016/08/15 Javascript
原生JS:Date对象全面解析
2016/09/06 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
vue-cli如何添加less 以及sass
2017/07/06 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
Vuex 入门教程
2018/01/10 Javascript
Vue引入jquery实现平滑滚动到指定位置
2018/05/09 jQuery
深入解析koa之异步回调处理
2019/06/17 Javascript
js实现列表按字母排序
2020/08/11 Javascript
原生js实现购物车
2020/09/23 Javascript
python 控制语句
2011/11/03 Python
利用Python实现在同一网络中的本地文件共享方法
2018/06/04 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
tensorflow实现将ckpt转pb文件的方法
2020/04/22 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
萨克斯第五大道精品百货店: Saks Fifth Avenue
2017/04/28 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年教师工作总结
2014/11/10 职场文书
2014年招生工作总结
2014/11/26 职场文书
秋菊打官司观后感
2015/06/03 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python