为什么wx.Yield()不起作用?

时间:2018-02-13 08:10:30

标签: python wxpython

我很清楚/熟悉如何在wxPython中处理LongRunningTasks(使用threading.Thread工作正常)。但我总是想知道,为什么wx.Yield()及其兄弟姐妹不工作(或者如何正确使用它们)。

附上一个(不是那么)最小的例子,用4.0.0a2 msw (phoenix)测试:

from __future__ import print_function
from time import sleep
from datetime import datetime
import wx

def long_running(handler):
    for i in range(10):
        thetxt = '{0}: {1}'.format(str(datetime.now()), str(i))
        sleep(1) # using this as drop-in for something which is blocking
        wx.SafeYield()
        wx.CallAfter(handler, thetxt)

class tst_frm(wx.Frame):
    def __init__(self, *args, **kwds):
        wx.Frame.__init__(self, *args, **kwds)
        self.btn = wx.Button(self, -1, 'Click to Status')
        self.btn.Bind(wx.EVT_BUTTON, self.on_btn)

    def on_btn(self, evt):
        the_txt = '{0}: EVT_BUTTON'.format(str(datetime.now()))
        self.update_prog(the_txt)

    def update_prog(self, update_txt):
        """Handler for task update (``str``)."""
        print(update_txt)

if __name__ == '__main__':
    app = wx.App(redirect=False)
    frm = tst_frm(None, -1, 'test_long')
    frm.Show()

    handler = frm

    long_running(handler.update_prog)

    app.MainLoop()

编辑:会发生什么:

  • 处理wx.CallAfter个事件
  • 按钮事件已注册,但仅在long_running完成后才在GUI中处理

我的问题:

  • wx.Yield应该允许处理堆积的事件吗?
  • 这个示例是否可以与wx.Yield一起使用,如果是,怎么做?
  • 如果没有,为什么它不起作用的解释是什么?

1 个答案:

答案 0 :(得分:1)

wxpython-users中的人能够回答这个问题。有两件事是错的:

  1. long_runningapp.MainLoop()有机会处理事件之前启动。现在确保在{MainLoop 之后<{1}}开始
  2. long_running是允许处理wx事件循环的正确方法
  3. 修改为此功能:

    wx.Yield()