现在的位置: 首页 > 综合 > 正文

wxpython后台线程更新界面控件方法

2013年10月06日 ⁄ 综合 ⁄ 共 2342字 ⁄ 字号 评论关闭

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操作对于无法预知的程序崩溃和调试来说是一个好的办法。基于技术方面的原因,如许多UnixGUI库不是线程安全性的,以及在微软WindowsUI对象的创建问题,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()

抱歉!评论已关闭.