我在文档中找到了wx.CallAfter和wx.CallLater,但两者都解决不了我的问题。我要做的是在执行任务时更新状态栏,但是wx.CallAfter和wx.CallLater只在任务之后更新。
示例:
#!/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()发布于 2011-10-04 02:24:57
从它的声音来看,"CallDuring“只不过是简单地调用您想要的任何函数。当你叫它的时候,它就会被调用。为什么直接打电话并不能解决你的问题呢?
然而,你是在告诉你的节目睡觉。没有多少“通话期间”会帮助你,因为你把整个应用程序睡觉。也许您认为sleep是“真实”代码的一个很好的模拟,但它不是。您实际上是在告诉您的程序“停止所有处理”,其中包括屏幕更新。
问题的症结在于,您不允许事件循环处理重绘事件。您可以尝试在循环中调用wx.Yield(),但是在GUI程序的主线程中有一个长时间运行的大循环是一种代码嗅探。几乎可以肯定有更好的方法来解决你的问题。
我能给出的最好建议是搜索"wxpython长时间运行任务“。最有可能的是,第一个点击将是一个名为"长时间运行任务“的wxpywiki页面,您可能会发现它很有帮助。
https://stackoverflow.com/questions/7617414
复制相似问题