多个wx.Yield()替代

时间:2014-03-11 13:43:54

标签: python wxpython

我目前有一个wxpython gui应用程序,它读取一个不断增长的文本文件并将其打印到wx.TextCtrl窗口。我需要同时运行其中两个,但显然是碰到了wxYield,称为递归错误。 是否有一个简单的替代wx.Yield,这将允许我运行倍数?

self.running_log = wx.TextCtrl(self, -1, pos=(5, 5), size=(875,605),
                                       style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL)

while True:
    wx.Yield()
    fileSize = os.path.getsize(logPath)
    if fileSize > lastSize:
        lines = infile.readlines()
        newLines = 0
        for line in lines[lastLineIndex:]:
            newLines += 1
            print line.rstrip()
        self.running_log.AppendText(line)

2 个答案:

答案 0 :(得分:1)

看看wxPython wiki:LongRunningTasks。 在那里,您将看到使用wxYield的两种替代方法:线程化或将处理放入EVT_IDLE处理程序。

但是既然你已经在使用wxYield了,那么让我建议一个你可以尝试的解决方案,然后再换成别的东西:使用一个标志来表明你是否已经在运行。如果该标志为true,则不要让代码再次执行wxYield。

当你致电wx.Yield()时,wxPython将控制并处理它需要处理的任何事件。完成后,您的长期运行任务将在您的收益率调用之后再次进行。因此,您可以将所有处理放在一个循环中,只要需要就让它在那里旋转。通过添加标志,您可以将入口点限制为仅为收益率的位置。处理完成后,通过切换标志释放“锁定”,代码的入口点再次变为实际的方法调用。

有些事情:

if not running:
    running = True
    while True:
        wx.Yield()
        fileSize = os.path.getsize(self.logPath)
        if fileSize > lastSize:
            lines = infile.readlines()
            newLines = 0
            for line in lines[lastLineIndex:]:
                newLines += 1
                self.running_log.AppendText(line)
        # When you are finished, set running to False and break

请注意,检查getsize的调用频率可能是个好主意。如果它经常发生,你可以通过确保经过一段短时间来限制它,以避免过多的呼叫减慢你的系统。

答案 1 :(得分:0)

wx.SafeYield()是否旨在解决这个确切的问题?

例如,在此处查看enter link description here