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

Python 为什么wx.Yield()不起作用?,python,wxpython,Python,Wxpython,我很清楚/熟悉如何在wxPython中处理(使用threading.Thread工作正常)。但我总是想知道,为什么wx.Yield()和它的兄弟姐妹不能工作(或者如何正确使用它们) 附上一个(并非如此)最小示例,使用4.0.0a2 msw(凤凰城)进行测试: 编辑:发生了什么: 处理wx.CallAfter事件 按钮事件已注册,但只有在long\u running完成后,才会在GUI中处理 我的问题是: wx.Yield是否允许处理堆积的事件 这个例子能否与wx.Yield一起使用?如果是

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

附上一个(并非如此)最小示例,使用
4.0.0a2 msw(凤凰城)
进行测试:

编辑:发生了什么:

  • 处理
    wx.CallAfter
    事件
  • 按钮事件已注册,但只有在
    long\u running
    完成后,才会在GUI中处理
我的问题是:

  • wx.Yield
    是否允许处理堆积的事件
  • 这个例子能否与wx.Yield一起使用?如果是,如何使用
  • 如果没有,为什么它不起作用
坐在车里的人能够回答这个问题。有两件事是错的:

  • long\u running
    是在app.MainLoop()有机会处理事件之前启动的。现在确保在主循环之后启动长时间运行的
  • wx.Yield()
    是允许处理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.CallAfter(handler, thetxt)
            wx.Yield()
    
    …
    
    if __name__ == '__main__':
        …
    
        wx.CallLater(1500, long_running, handler.update_prog)
    
        app.MainLoop()
    
    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.CallAfter(handler, thetxt)
            wx.Yield()
    
    …
    
    if __name__ == '__main__':
        …
    
        wx.CallLater(1500, long_running, handler.update_prog)
    
        app.MainLoop()