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监控网卡流量并使用graphite绘图的示例
Apr 27 Python
python使用pymysql实现操作mysql
Sep 13 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
python版简单工厂模式
Oct 16 Python
利用Python如何将数据写到CSV文件中
Jun 05 Python
python连接mongodb密码认证实例
Oct 16 Python
python for 循环获取index索引的方法
Feb 01 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
Apr 01 Python
python实现点击按钮修改数据的方法
Jul 17 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
深入了解如何基于Python读写Kafka
Dec 31 Python
用sleep间隔进行python反爬虫的实例讲解
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
php中的静态变量的基本用法
2014/03/20 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
Javascript 多浏览器兼容总结(实战经验)
2013/10/30 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
分享jQuery封装好的一些常用操作
2016/07/28 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
JavaScript获取键盘按键的键码(参照表)
2017/01/10 Javascript
VUE 单页面使用 echart 窗口变化时的用法
2020/07/30 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
python网络编程学习笔记(六):Web客户端访问
2014/06/09 Python
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
2014/06/18 Python
python列表操作实例
2015/01/14 Python
在centos7中分布式部署pyspider
2017/05/03 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
基于matplotlib xticks用法详解
2020/04/16 Python
python名片管理系统开发
2020/06/18 Python
解决tensorflow 释放图,删除变量问题
2020/06/23 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
用python发送微信消息
2020/12/21 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
Html5中的桌面通知Notification的实现
2018/09/25 HTML / CSS
爱游人:Travelliker
2017/09/05 全球购物
刑事代理授权委托书
2014/09/17 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
驳回起诉裁定书
2015/05/19 职场文书
pytorch 预训练模型读取修改相关参数的填坑问题
2021/06/05 Python
html+css实现环绕倒影加载特效
2021/07/07 HTML / CSS