wxPython Application.DoEvents()等价?

时间:2010-02-26 14:18:45

标签: python wxpython wxwidgets

wxPython中是否有Application.DoEvents()等效?

我正在创建一个表单,然后执行一个缓慢的I / O事件,并且只有在事件结束之前才会部分绘制表单。我希望在I / O启动之前完全绘制表单。

我已经尝试了self.Refresh(),但它没有效果。

1 个答案:

答案 0 :(得分:1)

wx.Yieldwx.SafeYield

虽然您应该使用单独的线程来执行I / O并使用wx.CallAfter将更新发布到GUI线程。

我通常使用这样的模式:

def start_work(self):
    thread = threading.Thread(target=self.do_work, args=(args, go, here))
    thread.setDaemon(True)
    thread.start()
def do_work(self, args, go, here):
    # do work here
    # wx.CallAfter will call the specified function on the GUI thread
    # and it's safe to call from a separate thread
    wx.CallAfter(self.work_completed, result, args, here)
def work_completed(self, result, args, here):
    # use result args to update GUI controls here
    self.text.SetLabel(result)

您可以从GUI调用start_work,例如在EVT_BUTTON事件上启动工作。 do_work在一个单独的线程上运行,但它无法执行任何与GUI相关的操作,因为必须在GUI线程上完成。所以你使用wx.CallAfter在GUI线程上运行一个函数,你可以从工作线程中传递它。