【问题标题】: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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2014-04-09
      • 1970-01-01
      相关资源
      最近更新 更多