wxpython中启用线程的方法,将GUI和功能的执行分开。
网上关于python多线程防假死与线程传递消息是几年前的,这里由于wxpython和threading模块已经更新最新,因此给出最新修改代码,能在2017年最新版的python和模块中运行。
原来的publisher()和callafter都无法使用。
修改后的代码。
import time import wx from threading import Thread from wx.lib.pubsub import pub 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(pub.sendMessage, "update", msg=i) time.sleep(0.5) class MyForm ( wx.Frame ): def __init__( self, parent ): wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = "www.OmegaXYZ.com", 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, "执行线程", 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, "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 ) pub.subscribe(self.updateDisplay, "update") def updateDisplay(self, msg): t = msg 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("线程开始") event.GetEventObject().Disable() if __name__ == "__main__": app = wx.App() MyForm(None).Show() app.MainLoop()
以上这篇wxpython多线程防假死与线程间传递消息实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍wxpython中利用线程防止假死的实现方法,包括了wxpython中利用线程防止假死的实现方法的使用技巧和注意事项,需要的朋友参考一下 前段时间我编写了一个工业控制的软件,在使用中一直存在一个问题,就是当软件检索设备时,因为这个功能执行的时间比较长,导致GUI界面假死,让用户分辨不清楚软件到底仍在执行,还是真的挂掉了。(虽然我设计了同步log显示,但是这个也同样假死了) 程序截图如
消息传递 稍加考虑,上一节的练习题其实是不完整的,它只是评分系统中的一环,一个评分系统是需要先把信息从数据库或文件中读取出来,然后才是评分,最后还需要把评分结果再保存到数据库或文件中去。如果一步一步串行地做这三个步骤,是完全没有问题的。那么我们是否可以用三个线程来分别做这三个步骤呢?上一节练习题我们已经用了一个线程来实现评分,那么我们是否也可以再用一个线程来读取成绩,再用另个线程来实现保存呢? 如
本文向大家介绍Java多线程中线程间的通信实例详解,包括了Java多线程中线程间的通信实例详解的使用技巧和注意事项,需要的朋友参考一下 Java多线程中线程间的通信 一、使用while方式来实现线程之间的通信 程序输出: 理解:线程Thread2不停地通过while语句检测这个条件(list.size()==5)是否成立 ,从而实现了线程间的通信。但是这种方式会浪费CPU资源。 二、wait no
本文向大家介绍Java多线程实战之单例模式与多线程的实例详解,包括了Java多线程实战之单例模式与多线程的实例详解的使用技巧和注意事项,需要的朋友参考一下 1、立即加载/饿汉模式 立即加载/饿汉模式是在类创建的同时已经创建好一个静态的对象供系统使用,不存在线程安全问题 2、延迟加载/懒汉模式 延迟加载/懒汉模式是在调用方法时实例才被创建,在多线程环境下,会出现取出多个实例的情况,与单例模式的初衷是
本文向大家介绍java 多线程死锁详解及简单实例,包括了java 多线程死锁详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦。除非你不使用多线程,否则死锁的可能性会一直存在。为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2)模块使用锁的差异 (3)版本之间的差异
本文向大家介绍Java多线程 线程组原理及实例详解,包括了Java多线程 线程组原理及实例详解的使用技巧和注意事项,需要的朋友参考一下 线程组 线程组可以批量管理线程和线程组对象。 一级关联 例子如下,建立一级关联。 输出结果如下 每隔三秒输出两个线程名称,符合预期。 线程组自动归组属性 输出结果如下 没有指定线程组,则归属到当前线程所属的组。 根线程组 运行结果 当前线程的线程组的父线程组是系统