一种简单的方法来解释初学者的PyQt进度条

时间:2017-07-17 08:56:16

标签: python python-2.7 progress-bar pyqt4

我正在尝试制作一个进度条来处理我在pyqt中的非常简单的测试应用程序但不幸的是我对如何实现我看到的一些examples没有任何想法,因为它们超越我的头脑所以请忍受我的新手问题。

我们说我有一个非常简单的QMainWindow

class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(750, 450, 400, 200)
        self.setFixedSize(self.size())
        btn1 = QtGui.QPushButton("Convert", self)
        btn1.move(210,171)
        btn1.clicked.connect(self.output_convert)

    def output_convert(self):
        #very long process to convert a txt file to excel
        #Here is where I would like to implement a progress bar

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    app.exec_()

run()

如何在output_convert中至少实现一个脉冲进度条? 让我感到困惑的是如何调用/执行example中的代码。我可以在没有子类化的情况下完成并纯粹在函数中吗?它取决于output_convert代码吗? TLDR:如何在执行很长的代码时实现进度条(新手友好)?

更新1 经过一整天,我得到了部分工作,这是我的代码

class Window(QtGui.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(750, 450, 400, 200)
        self.setFixedSize(self.size())
        btn1 = QtGui.QPushButton("Convert", self)
        btn1.move(210,171)
        btn1.clicked.connect(self.progbar)

    def progbar (self):
        self.prog_win = QDialog()
        self.prog_win.resize(400, 100)
        self.prog_win.setFixedSize(self.prog_win.size())
        self.prog_win.setWindowTitle("Processing request")
        self.lbl = QLabel(self.prog_win)
        self.lbl.setText("Please Wait.  .  .")
        self.lbl.move(15,18)
        self.progressBar = QtGui.QProgressBar(self.prog_win)
        self.progressBar.resize(410, 25)
        self.progressBar.move(15, 40)
        self.progressBar.setRange(0,1)
        self.myLongTask = TaskThread()

        #I think this is where I am wrong
        self.prog_win.show()
        self.myLongTask.taskFinished.connect(self.onStart)
        self.output_settings()

    def onStart(self): 
        self.progressBar.setRange(0,0)
        self.myLongTask.start()

    def output_convert(self):
        #very long process to convert a txt file to excel

class TaskThread(QtCore.QThread):
    taskFinished = QtCore.pyqtSignal()
    def run(self):
        time.sleep(3)
        self.taskFinished.emit()

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    app.exec_()
run()

我现在可以看到我缺少的东西,我真正需要的是Threading。我读了一遍,每个人都说它需要多线程和子类化是一个坏主意。它部分起作用,因为进度条在处理时挂起。

1 个答案:

答案 0 :(得分:0)

        self.progressBar = QtWidgets.QProgressBar(self.centralWidget)
        self.progressBar.setGeometry(QtCore.QRect(150, 140, 481, 37))
        self.progressBar.setStyleSheet("your values")
        self.progressBar.setProperty("value", 70)
        self.progressBar.setObjectName("progressBar")

这是我用过的进度条的代码, 第一行定义了QtWidget的类型,在我们的例子中是进度条,它采用了参数,中央小部件,它表明这将是中央小部件的一部分, 设置几何是定位和大小。 设置样式表是指定颜色和内容的位置。 set属性函数用于设置进度条的值或填充,这是您想要改变的。

大多数情况下,这个小部件依赖于os。也就是说,如果您正在使用Windows,则默认情况下您将获得Windows脉冲进度条。但在其他操作系统中,例如linux,您必须使用setstyle()函数设置窗口小部件的默认样式。