我目前有一个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)
答案 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