【问题标题】:Use a Progress Bar in a GUI在 GUI 中使用进度条
【发布时间】:2015-05-27 10:39:49
【问题描述】:

我有一个启动 FME 脚本的界面(FME 是一个 Extract-Transform-Load 软件),我想要一个进度条来通知用户脚本执行的进度。

浏览了一些文档和论坛后,我了解到进度条需要一个值才能运行(即循环中的值)。问题是,我没有真正的价值观,我只有一个可以运行的脚本,我想知道它有多远。

所以我有一个信号:每次单击按钮时,它都会发出一个信号来更改进度条的值。但是当我写ui.progressBar.setValue() 时,我需要一个值,但我不知道这个值应该是什么。

我不知道我是否使用了正确的工具,或者是否有更简单/更好的工具。

【问题讨论】:

  • 要显示进度条,您需要知道您的进度。您可以猜测任务需要多长时间,然后显示一个百分比,如果这对您来说足够好的话。您也可以只显示旋转圆圈(或沙漏或填充条)以表明您的应用程序没有崩溃。
  • 进度条不需要值即可运行。只需将最小值和最大值设置为零,它就会用作忙碌指示器。

标签: python user-interface pyqt progress-bar


【解决方案1】:

这是我在执行长操作(例如 HTTP 请求)时经常在我的不同脚本中使用的一个 sn-p。这只是一个基本的纺车,几秒钟后就会消失。但是你也可以使用信号和槽来隐藏它。

import math, sys
from PyQt4.QtCore import Qt, QTimer
from PyQt4.QtGui import *

class Overlay(QWidget):

    def __init__(self, parent = None):

        QWidget.__init__(self, parent)
        palette = QPalette(self.palette())
        palette.setColor(palette.Background, Qt.transparent)
        self.setPalette(palette)

    def paintEvent(self, event):

        painter = QPainter()
        painter.begin(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.fillRect(event.rect(), QBrush(QColor(255, 255, 255, 127)))
        painter.setPen(QPen(Qt.NoPen))

        for i in range(6):
            if (self.counter / 5) % 6 == i:
                painter.setBrush(QBrush(QColor(127 + (self.counter % 5)*32, 127, 127)))
            else:
                painter.setBrush(QBrush(QColor(127, 127, 127)))
            painter.drawEllipse(
                self.width()/2 + 30 * math.cos(2 * math.pi * i / 6.0) - 10,
                self.height()/2 + 30 * math.sin(2 * math.pi * i / 6.0) - 10,
                20, 20)

        painter.end()

    def showEvent(self, event):

        self.timer = self.startTimer(50)
        self.counter = 0

    def timerEvent(self, event):

        self.counter += 1
        self.update()
        if self.counter == 60:
            self.killTimer(self.timer)
            self.hide()


class MainWindow(QMainWindow):

    def __init__(self, parent = None):

        QMainWindow.__init__(self, parent)

        widget = QWidget(self)
        self.editor = QTextEdit()
        self.editor.setPlainText("0123456789"*100)
        layout = QGridLayout(widget)
        layout.addWidget(self.editor, 0, 0, 1, 3)
        button = QPushButton("Wait")
        layout.addWidget(button, 1, 1, 1, 1)

        self.setCentralWidget(widget)
        self.overlay = Overlay(self.centralWidget())
        self.overlay.hide()
        button.clicked.connect(self.overlay.show)

    def resizeEvent(self, event):

        self.overlay.resize(event.size())
        event.accept()


if __name__ == "__main__":

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

由于您没有提供任何代码,因此我无法对其进行调整以满足您的需求。

另外,这里是source of the snippet。 这个wiki上有很多有趣的sn-ps:Python.org wiki

【讨论】:

  • 非常感谢!我会修改你的脚本(我正在使用 PyQt5),并且链接中有许多我可以使用的有趣的 sn-ps!
猜你喜欢
  • 2013-02-02
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多