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描述器descriptor详解
Feb 03 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
Python中的asyncio代码详解
Jun 10 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
Jun 19 Python
Django实现跨域的2种方法
Jul 31 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
python实现音乐播放器 python实现花框音乐盒子
Feb 25 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
Sep 16 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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
Gregarius中文日期格式问题解决办法
2008/04/22 PHP
PHP操作MongoDB GridFS 存储文件的详解
2013/06/20 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
详谈PHP编码转换问题
2015/07/28 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
php curl常用的5个经典例子
2017/01/20 PHP
浅谈laravel数据库查询返回的数据形式
2019/10/21 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
Javascript面向对象之四 继承
2011/02/08 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
基于JavaScript中标识符的命名规则介绍
2018/01/06 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
vue 使用原生组件上传图片的实例
2020/09/08 Javascript
python实现登陆知乎获得个人收藏并保存为word文件
2015/03/16 Python
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
Python实现发送QQ邮件的封装
2017/07/14 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
python中logging包的使用总结
2018/02/28 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python代码打开本地.mp4格式文件的方法
2019/01/03 Python
python实现简易淘宝购物
2019/11/22 Python
css3闪亮进度条效果实现思路及代码
2013/04/17 HTML / CSS
社区母亲节活动记录
2014/03/06 职场文书
2014年高数考试作弊检讨书
2014/12/14 职场文书
领导参观欢迎词
2015/01/26 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书