2011-10-01 53 views
0

我发现wx.CallAfterwx.CallLater在文档中,但都没有解决我的问题。 我想要做的是在做任务时更新状态栏,但wx.CallAfterwx.CallLater只在任务后更新。在wxpython中有一个wx.CallDuring

例子:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# generated by wxGlade 0.6.3 on Fri Sep 30 20:55:34 2011 

import wx 
import time 
# begin wxGlade: extracode 
# end wxGlade 



class MyFrame1(wx.Frame): 
    def __init__(self, *args, **kwds): 
     # begin wxGlade: MyFrame1.__init__ 
     kwds["style"] = wx.DEFAULT_FRAME_STYLE 
     wx.Frame.__init__(self, *args, **kwds) 
     self.frame_2_statusbar = self.CreateStatusBar(1, 0) 

     self.__set_properties() 
     self.__do_layout() 
     # end wxGlade 

    def __set_properties(self): 
     # begin wxGlade: MyFrame1.__set_properties 
     self.SetTitle("frame_2") 
     self.frame_2_statusbar.SetStatusWidths([-1]) 
     # statusbar fields 
     frame_2_statusbar_fields = ["foo"] 
     for i in range(len(frame_2_statusbar_fields)): 
      self.frame_2_statusbar.SetStatusText(frame_2_statusbar_fields[i], i) 
     # end wxGlade 

    def __do_layout(self): 
     # begin wxGlade: MyFrame1.__do_layout 
     self.Layout() 
     # end wxGlade 
    def Test(self): 
    time.sleep(10) 
     for i in range(0,100): 
     time.sleep(0.1) 
     txt="I <3 Stack Exchange x " +str(i) 
     wx.CallAfter(self.frame_2_statusbar.SetStatusText,txt, 0) 
     wx.CallAfter(self.Update) 
     print txt 
# end of class MyFrame1 


if __name__ == "__main__": 
    app = wx.PySimpleApp(0) 
    wx.InitAllImageHandlers() 
    frame_1 = MyFrame1(None, -1, "") 
    app.SetTopWindow(frame_1) 
    frame_1.Show() 
    wx.CallAfter(frame_1.Test) 
    app.MainLoop() 

回答

3

从它的声音, “CallDuring” 无非是简单地调用任何你想要的功能更多。它会在你打电话时被完全调用。为什么直接调用它并不能解决您的问题,是否有理由?

但是,你告诉你的程序要睡觉。由于您将整个应用程序设置为睡眠状态,因此“过程中”的任何次数都不会帮助您。也许你认为sleep是一个很好的“真实”代码模拟,但事实并非如此。你实际上是在告诉你的程序“停止所有处理”,其中包括屏幕更新。

问题的症结在于你不允许事件循环来处理重绘事件。你可以尝试在你的循环中调用wx.Yield(),但是在GUI程序的主线程中有一个大的,长时间运行的循环是一种代码异味。几乎可以肯定有更好的方式来处理你的问题。

我可以给的最好的建议是搜索“wxpython长时间运行的任务”。最有可能的第一个命中将是一个wxpywiki页面,标题为“Long Running Tasks”,您可能会发现有帮助。

+0

wx.Yield(),作品谢谢:) – linuxrules94