wxpython后台线程更新界面控件方法
来源:互联网 发布:淘宝导航栏字体加粗 编辑:程序博客网 时间:2024/05/19 15:23
http://blog.sina.com.cn/s/blog_56146dc501009ea9.html
http://www.th7.cn/Program/Python/201303/128088.shtml
http://blog.donews.com/limodou/archive/2005/08/15/509966.aspx
在大多数的GUI应用程序中,在应用程序的后台中长期执行一个处理过程而不干涉用户与应用程序的其它部分的交互是有好处的。允许后台处理的机制通常是产生一个线程并在该线程中长期执行一个处理过程。对于wxPython的多线程有两点需要特别说明。
最重要的一点是,GUI的操作必须发生在主线程或应用程序的主循环所处的地方中。在一个单独的线程中执行GUI操作对于无法预知的程序崩溃和调试来说是一个好的办法。基于技术方面的原因,如许多Unix的GUI库不是线程安全性的,以及在微软Windows下UI对象的创建问题,wxPython没有设计它自己的发生在多线程中的事件,所以我们建议你也不要尝试。如果你在更新UI界面时不使用,那么你可能会遇到奇怪的问题。有时GUI也忙运行挺正常,有时却会无缘无故的崩溃。上面的禁令包括与屏幕交互的任何项目,尤其包括wx.Bitmap对象。
对于wxPython应用程序,关于所有UI的更新,后台线程只负责发送消息给UI线程,而不关心GUI的更新。幸运的是,wxPython没有强制限定你能够有的后台线程的数量。\
最常用的技术是使用wx.CallAfter()函数,wxPython的全局函数wx.CallAfter(),该函数是传递消息给你的主线程的最容易的方法。wx.CallAfter()使得主线程在当前的事件处理完成后,可以对一个不同的线程调用一个函数。传递给wx.CallAfter()的函数对象总是在主线程中被执行。
#执行测试并把执行过程打印到日志监控界面
def runSuit(self,event):
#在这里创建一个后台线程
thread.start_new_thread(runSuitFunc,(self,self.logText,self.selected,self.panel))
#使用后台线程调用RunTest.runSuit1执行测试并监测执行过程,并生成测试报告
defrunSuitFunc(self,logText,suitSelected,panel):
testsuit=RunTest.runSuit1(suitSelected,logText)
gbReport=GbReport.GbReport()
RES=gbReport.generateHtmlReport(testsuit)
#GUI的更新必须在主循环处进行,使用wx.CallAfter来达到这个目的
wx.CallAfter(self.generateFigure,RES,self.panel)
thread.exit_thread()
#显示测试结果统计信息和统计图,更新GUI,这个函数是在主循环中进行的
def generateFigure(self,testRes,panel):
#在左侧显示测试执行结果统计信息
font=wx.Font(9,wx.DEFAULT,wx.NORMAL,wx.BOLD)
resStr="用例集总共用例数:"+str(testRes[1])
print resStr
self.totalSuitText=wx.StaticText(self.panel,-1,resStr,(20,250))
self.totalSuitText.SetFont(font)
resStr="执行成功用例个数:"+str(testRes[2])
self.successSuitText=wx.StaticText(self.panel,-1,resStr,(20,280))
self.successSuitText.SetFont(font)
resStr="不存在的用例个数:"+str(testRes[3])
self.failSuitText=wx.StaticText(self.panel,-1,resStr,(20,310))
self.failSuitText.SetFont(font)
resStr="执行失败用例个数:"+str(testRes[4])
self.notexistSuitText=wx.StaticText(self.panel,-1,resStr,(20,340))
self.notexistSuitText.SetFont(font)
#在右侧显示测试执行结果统计图
figPath=testRes[0]
img1 = wx.Image(figPath,wx.BITMAP_TYPE_ANY)
w = img1.GetWidth()
h = img1.GetHeight()
img1 = img1.Scale(w/2,h/2)
img1 = img1.ConvertToBitmap()
wx.StaticBitmap(self.panel,-1,img1,(160,225),(w/2,h/2))
self.panel.Refresh()
- wxpython后台线程更新界面控件方法
- 后台线程更新界面的巧妙方法
- 后台线程使用 SynchronizationContext 更新主界面
- VS2005中更新其他线程访问界面线程控件的方法
- C# 线程中更新界面控件
- C# 线程中更新界面控件
- 界面主线程,子线程更新主界面控件
- ios后台更新界面
- 跨线程更新UI控件的方法
- c#中后台线程更新主线程ui的方法
- 子线程更新界面
- 在分线程更新主线程的Ui界面方法
- 线程更新UI界面的4种方法
- 非UI线程更新UI界面的各种方法小结
- 非UI线程更新UI界面的各种方法小结
- C# Winform使用线程,委托定时更新界面UI控件,解决界面卡顿问题
- wxPython 控件
- wxpython的崩溃-一切源于非main线程更新GUI
- RMQ(区间最大值)
- JNI学习(1)(我是菜鸟)
- SQL Server 创建表 添加主键 添加列常用SQL语句
- 地图 常用坐标系
- MyBatis 的简单应用(转载)
- wxpython后台线程更新界面控件方法
- 设计模式 - 策略模式
- Rails中文Podcasts【四】
- 《dig挖出DNS的秘密》-linux命令五分钟系列之三十四
- sql文学习.....关于条件判断的查询....case-when-then
- NLP中文信息处理---正向最大匹配法分词
- 应用设计避免犯四大常见错误
- 创建型模式总结
- JBox的简单使用例子