版权所有,转载请注明出处:http://guangboo.org/2013/08/23/wxpython-non-gui-thread-call-gui-method
之前有介绍了《wxPython多线程支持》,包含了wx.CallAfter, wx.PostEvent, wxCallLater的用法,本文将wx.CallAfter封装成decorator,使得UI线程中的方法可以在非UI线程中调用。
本文将wx.CallAfter方法进行了封装,代码如下:
import wx
def call_after(func):
def _wrapper(*args, **kwargs):
return wx.CallAfter(func, *args, **kwargs)
return _wrapper
当UI线程中的方法需要被非UI线程调用时,只有使用call_after进行修饰即可。如下对《wxPython多线程》中的实例改进:
import time
import wx
from threading import Thread
from wx.lib.pubsub import Publisher
def call_after(func):
def _wrapper(*args, **kwargs):
return wx.CallAfter(func, *args, **kwargs)
return _wrapper
class MyForm(wx.Frame):
#----------------------------------------------------------------------
def __init__(self):
wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial")
# Add a panel so it looks the correct on all platforms
panel = wx.Panel(self, wx.ID_ANY)
self.displayLbl = wx.StaticText(panel, label="Amount of time since thread started goes here")
self.btn = btn = wx.Button(panel, label="Start Thread")
btn.Bind(wx.EVT_BUTTON, self.onButton)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.displayLbl, 0, wx.ALL|wx.CENTER, 5)
sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
panel.SetSizer(sizer)
self._thread = Thread(target = self.run, args = ())
self._thread.daemon = True
def run(self):
i = 0
while True:
i += 1
time.sleep(1)
self.updateDisplay('Seconds: %d' % i)
#----------------------------------------------------------------------
def onButton(self, event):
"""
Runs the thread
"""
self._thread.start()
self.started = True
self.displayLbl.SetLabel("Thread started!")
btn = event.GetEventObject()
btn.Disable()
@call_after
def updateDisplay(self, msg):
"""
Receives data from thread and updates the display
"""
self.displayLbl.SetLabel(msg)
#----------------------------------------------------------------------
# Run the program
if __name__ == "__main__":
app = wx.PySimpleApp()
frame = MyForm().Show()
app.MainLoop()
源代码下载:demo.py
分享到:
相关推荐
今天小编就为大家分享一篇wxpython多线程防假死与线程间传递消息实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
Python GUI制作实例 wxPython使用多线程 防假死含wxFormBuilder的文件及源码
自己用wxpython写的web摄像头界面,能显示与其相对应分辨率的rgb565格式的图像。
wxpython中文教程wxpython中文教程wxpython中文教程wxpython中文教程wxpython中文教程wxpython中文教程wxpython中文教程wxpython中文教程wxpython中文教程
几本很不错的关于python gui的wxPython的书,包括“wxPython in Action(中文版)” 活学活用wxPython “《wxPython in Action》Noel Rappin, Robin Dunn著 2006年版”
wxPython是跨平台的。这意味着同一个程序可以不经修改地在多种平台上运行。现今支持的平台有:32位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac OS X。 由于使用Python作为编程语言,wxPython编写简单、...
wxPython是跨平台的。这意味着同一个程序可以不经修改地在多种平台上运行。现今支持的平台有:32位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac OS X。 由于使用Python作为编程语言,wxPython编写简单...
wxpython线程安全方法 wxPython中,有三个“线程安全”的函数。如果你在更新UI界面时,三个函数都不使用,那么你可能会遇到奇怪的问题。有时GUI也忙运行挺正常,有时却会无缘无故的崩溃。因此就需要这三个线程安全的...
python2.4相对应的wxPython,还有很多库,一次性下载,不用费心去找了。
wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。 下面的2个实例代码是实现wxPython窗体特殊效果演示大家可以研究下 wxPython无边框窗体实现代码如下: import wx class ...
wxPython开发参考书籍
使用WxPython进行Win32下Python...然后我们创建一个调用更多的例子,讲述了一些这个工具包中更多的高组特性,使用了你已经熟悉的Doubletalk金融模型的类。(文章是如此,谁知道Doubletalk是个什么东东) 使用wxPython
wxPython 是 Python 语言的 GUI 工具包,作为 Python 的扩展模块实现,包装了 wxWidgets。 wxPython 是跨平台的,开源的。 此资源包含了大部分的wx 实例
wxPython的wxAuiNotebook实现Tab页效果
wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的。 就如同Python和wxWidgets一样,wxPython也是一款开源软件,并且具有非常优秀的跨平台能力,能够支持运行在32位windows、绝...
wxPython是一个用于创建桌面GUI应用程序的跨平台工具包。wxPython的主要作者是Robin Dunn。使用wxPython,开发人员可以在Windows,Mac和各种Unix系统上创建应用程序。
wxpython grid使用部分
Part1 wxPython入门 , wxPython入门 , wxPython入门里面有实例讲解
wxpython 学习,各种demo集合,