如何使用pyQt4设计器为python创建活动指示器

时间:2016-01-24 00:42:00

标签: python-2.7 pyqt4

我正在使用pyQt4学习GUI python。我在另一个文件python中有函数A。我想在文件.ui(设计器pyQt4的输出)中提取的GUI文件python中运行。如何创建在A函数运行时处于活动状态的活动指示器?我可以使用进度条(在pyQt4设计器中)而不知道我的函数A运行了多少时间?

谢谢。

这是在GUI .py中调用A的函数:

def RunFunction():
    import Kdtree
    _dir = kdTreeOk.getNeighbor(float(radius)) #function 'A'
    file = file_open('Summary.txt',_dir) # ignore, just file to save result of `A`
    with file:
         textOutput=file.read()
         ui.result.setPlainText(textOutput)

#### button to run RunFunction in file GUI .py

ui._run.clicked.connect(RunFunction)

1 个答案:

答案 0 :(得分:0)

QProgressDialog是为此而制作的,通常通过QThread调用。这是一个(杂乱的)基本示例,用于说明这是如何工作的(没有任何线程)。如果您从另一个窗口调用此对话框,只需将parent设置为调用窗口,您可以通过调用self.parent.some_variable来读取此对话框中的属性。

已编辑以正常工作;)。

from PyQt4 import QtCore, QtGui
from time import sleep
import sys

class ProgressBarWidget(QtGui.QProgressDialog):

    def __init__(self, parent=None, app=None):
        super(ProgressBarWidget, self).__init__(parent)

        self.app=app
        self._allow_close = True

        layout = QtGui.QVBoxLayout(self)

        # Create a progress bar and a button and add them to the main layout
        self.progressBar = QtGui.QProgressBar(self)
        self.progressBar.setRange(0,100)
        layout.addWidget(self.progressBar)
        self.button = QtGui.QPushButton("Start", self)
        layout.addWidget(self.button)

        self.button.clicked.connect(self.onStart)

        self.upload_count = 10


    def onStart(self):
        self.progressBar.setValue(0)
        self.button.setText("Uploading...")
        self.run()

    def makeProgress(self, current_num, total_num, message = ''):
        if total_num == current_num:
            self.onFinished()

        elif current_num == 0:
            self.progressBar.setValue(0)
        else:
            multiplier = int(float(float(100) / float(total_num)))
            c_times_m = current_num * multiplier
            for i in xrange(c_times_m - int(self.progressBar.value())):
                new_val = int(self.progressBar.value()) + 1
                self.progressBar.setValue(new_val)
                sleep(.01)


    def onFinished(self):
        # progress complete
        self.progressBar.setRange(0,100)
        for i in xrange(int(self.progressBar.value()),101):
            self.progressBar.setValue(i)
        self.button.setEnabled(True)
        self.button.setText('Exit')
        self.button.clicked.disconnect(self.onStart)
        self.button.clicked.connect(self.close)

    def run(self):
        self._allow_close = False
        self.button.setDisabled(True)

        total = self.upload_count * 2

        progress_meter = 0

        downloaded = []
        tests_to_upload = 10
        for each in xrange(tests_to_upload):
            sleep(0.15)
            progress_meter += 1
            self.makeProgress(progress_meter,total)

            sleep(0.2)
            progress_meter += 1

            self.makeProgress(progress_meter, total)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = ProgressBarWidget(app=app)
    window.resize(640, 480)
    window.show()
    sys.exit(app.exec_())