gpt4 book ai didi

python - 多个 wx.Yield() 替代方案

转载 作者:太空宇宙 更新时间:2023-11-04 06:05:35 28 4
gpt4 key购买 nike

我目前有一个 wxpython gui 应用程序,它读取不断增长的文本文件并将其打印到 wx.TextCtrl 窗口。我需要同时运行其中两个,但显然我遇到了 wxYield called recursively 错误。有没有 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)

最佳答案

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

但由于您已经在使用 wxYield,让我建议您在更改为其他内容之前可以尝试的解决方案:使用标志来指示您是否已经在运行。如果标志为真,不要让代码再次执行 wxYield。

当您调用wx.Yield() 时,wxPython 将控制并处理它需要处理的任何事件。完成后,您的长时间运行的任务将在您的 yield 调用后立即再次执行。所以你可以把所有的处理放在一个循环中,让它在需要的时候旋转。通过添加一个标志,您可以将入口点限制在产量所在的位置。处理完成后,您可以通过切换标志来释放“锁定”,代码的入口点再次更改为实际的方法调用。

类似的东西:

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 的频率可能是个好主意。如果它发生得太频繁,您可以通过确保已经过去了一些短时间来限制它,以避免过多的调用减慢您的系统。

关于python - 多个 wx.Yield() 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22327494/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com