【问题标题】:Updating a wxPython progress bar after calling app.MainLoop()调用 app.MainLoop() 后更新 wxPython 进度条
【发布时间】:2011-08-04 14:34:23
【问题描述】:
我有一个执行计算的 python 脚本,并且我创建了一个用于弹出 wxPython 进度条的类。目前我有:
app=wx.App()
progress = ProgressBar()
app.MainLoop()
for i in xrange(len(toBeAnalysed)):
analyse(toBeAnalysed[i])
progress.update(i/len(toBeAnalysed)*100)
现在,由于显而易见的原因,此示例不起作用。有什么方法可以让我在不同的线程中运行 app.MainLoop(),但在计算完成时仍会传达进度(以及 .update() 它)?
感谢您的帮助。
【问题讨论】:
标签:
python
multithreading
wxpython
【解决方案1】:
您应该在后台线程中运行您的逻辑并使用wx.CallAfter 定期更新 GUI。 CallAfter 将在 GUI 线程上调用提供的函数,因此进行 GUI 调用是安全的。
import wx
import threading
import time
def do_stuff(dialog): # put your logic here
for i in range(101):
wx.CallAfter(dialog.Update, i)
time.sleep(0.1)
wx.CallAfter(dialog.Destroy)
def start(func, *args): # helper method to run a function in another thread
thread = threading.Thread(target=func, args=args)
thread.setDaemon(True)
thread.start()
def main():
app = wx.PySimpleApp()
dialog = wx.ProgressDialog('Doing Stuff', 'Please wait...')
start(do_stuff, dialog)
dialog.ShowModal()
app.MainLoop()
if __name__ == '__main__':
main()