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中的装饰器
Jul 31 Python
python3.5仿微软计算器程序
Mar 30 Python
Python脚本实时处理log文件的方法
Nov 21 Python
python正则中最短匹配实现代码
Jan 16 Python
python中单例常用的几种实现方法总结
Oct 13 Python
使用pycharm设置控制台不换行的操作方法
Jan 19 Python
Django中的静态文件管理过程解析
Aug 01 Python
Python&&GDAL实现NDVI的计算方式
Jan 09 Python
python读取raw binary图片并提取统计信息的实例
Jan 09 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
PyCharm 2020.2下配置Anaconda环境的方法步骤
Sep 23 Python
使用python将微信image下.dat文件解密为.png的方法
Nov 30 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
php把数据表导出为Excel表的最简单、最快的方法(不用插件)
2014/05/10 PHP
PHP常用的排序和查找算法
2015/08/06 PHP
php常用字符函数实例小结
2016/12/29 PHP
js格式化时间和js格式化时间戳示例
2014/02/10 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
JS中this上下文对象使用方式
2016/10/09 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
python实现微信自动回复功能
2018/04/11 Python
python爬虫之xpath的基本使用详解
2018/04/18 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
python文件选择对话框的操作方法
2019/06/27 Python
使用Python画股票的K线图的方法步骤
2019/06/28 Python
python爬虫神器Pyppeteer入门及使用
2019/07/13 Python
Pytorch之保存读取模型实例
2019/12/30 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
python烟花效果的代码实例
2020/02/25 Python
keras中的loss、optimizer、metrics用法
2020/06/15 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
Python headers请求头如何实现快速添加
2020/11/03 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
.NET remoting中对象激活的两种方式
2015/06/08 面试题
店长岗位的工作内容
2013/11/12 职场文书
幼儿教师师德演讲稿
2014/05/06 职场文书
党的群众路线学习笔记
2014/11/06 职场文书
2015年学校工作总结范文
2015/04/20 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android
Python作用域和名称空间的详细介绍
2022/04/13 Python