【问题标题】:Display busy progressBar for long process, no thread显示繁忙的进度条以进行长进程,无线程
【发布时间】:2016-04-02 11:13:24
【问题描述】:

我正在编写一个 PyQt GUI 应用程序,我想为我的一个函数显示一个繁忙的进度条,这需要时间来完成。代码如下:

self.progress = QtGui.QProgressDialog("Canceling...", None, 0, 0, self)
self.progress.setWindowTitle("Canceling refresh")
self.progress.show()

timer = QtCore.QTimer()
timer.singleShot(0, self.loadNotifications)

while timer.isActive():
    app.processEvents()

目前,我尝试使用 QTimer,但它不起作用。 CPU绑定函数是loadNotifications

我想在一个线程中启动它,并在它运行时更新 QProgressBar。

我当然可以围绕函数 loadNotifications 创建一个 QThread 类,但这对于我想做的事情来说有点过头了:在函数运行时简单地显示一个平滑的进度条。

你有什么想法吗?

【问题讨论】:

  • 您可以更新正在运行的函数中的进度条,这将冻结您的应用程序,或者(正如您已经提到的)您生成一个新线程来执行该函数,这是一种常见的方式处理这类事情。您可以使用connect 来更新进度条。
  • 难道没有一种灵活的方法可以只使用 long 函数作为参数来生成线程吗?
  • 您可以为此编写自己的小班。看看joplaete.wordpress.com/2010/07/21/threading-with-pyqt4
  • 是的,非常优雅和灵活。我会用那个。但是为什么我们不能默认这样做呢?

标签: python multithreading pyqt progress-bar


【解决方案1】:

我没有使用 PyQT 的经验,但在 tkinter 中,我通常通过让慢速函数定期调用传递给它的一些 update_progbar 函数来实现这一点。这个update_progbar 函数然后在与慢速函数相同的线程中更新进度条(因此暂时搁置)。

基本的:

def update_progbar(prog):
    print(prog)

def slow_function(prog_func):
    for i in range(100000):
        if i%1000 == 0:
           prog_func(i / 100000.0)
        do_something()

【讨论】:

  • 是的,我想过这个,@a_guest 也提到了。问题是它不是很灵活,你必须在慢函数中添加一些函数调用。就我而言,我只需要定期致电app.processEvents()
  • 你的函数无论如何都得做点什么。否则你的 GUI 怎么会知道当前的进度是什么?
  • 我不必知道实际的进度是什么,我只需要一个繁忙的进度条(所以我将progressBar的值设置为(0, 0))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多