python - 调用 app.MainLoop() 后更新 wxPython 进度条

标签 python multithreading wxpython

我有一个执行计算的 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() 它)?

感谢您的帮助。

最佳答案

您应该在后台线程中运行您的逻辑并使用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()

关于python - 调用 app.MainLoop() 后更新 wxPython 进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6943339/

相关文章:

python - 如何在 Cython 中调用多线程 C 函数?

java - 在Thread算法工作期间重绘JPanel

python - wxPython - wx.MessageDialog 不点击就消失

python - pandas:滚动意味着不工作

PyEnv 中 Ubuntu 20.04 上的 Python 2.7.12

mysql - Hibernate/MySQL 并发问题

python - 是否可以将 "set"列表添加到 ComboBox,wxpython?

python ObjectListView 用空行更新显示,即使列表具有有效数据

python - 从 AWS SageMaker 访问 Google BigQuery

python - 关于限制行长度以符合 PEP8 的不同方式的样式的一些建议