【问题标题】:wxPython Application.DoEvents() equivalent?wxPython Application.DoEvents() 等效?
【发布时间】:2010-02-26 14:18:45
【问题描述】:

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

我正在创建一个表单,然后执行一个缓慢的 I/O 事件,并且在事件完成之前只绘制了部分表单。我想在 I/O 开始之前完全绘制表单。

我试过self.Refresh(),但是没有效果。

【问题讨论】:

    标签: python wxpython wxwidgets


    【解决方案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线程上运行一个函数,你可以从工作线程传递它的参数。

    【讨论】:

    • 感谢您的快速响应。我会考虑在一个单独的线程上做 IO。
    • 非常感谢先生,没有说明如何在 wxpython 中正确使用 IO 的文档。您的示例很好地解释了它。
    猜你喜欢
    • 1970-01-01
    • 2011-10-11
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多