我很清楚/熟悉如何在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
一起使用,如果是,怎么做?答案 0 :(得分:1)
wxpython-users中的人能够回答这个问题。有两件事是错的:
long_running
在 app.MainLoop()
有机会处理事件之前启动。现在确保在{MainLoop 之后<{1}}开始
long_running
是允许处理wx事件循环的正确方法修改为此功能:
wx.Yield()