Actualmente estoy en el proceso de crear una GUI básica que une algunos scripts de análisis de datos. Estos scripts pueden tardar (dependiendo de los datos ingresados) un par de minutos en ejecutarse y esperaba incorporar una barra de progreso en la GUI para confirmar que los scripts se están ejecutando.

Sin embargo, como python (er) autodidacta, tengo algunas dificultades para implementar soluciones a mi problema. Puedo actualizar la barra de progreso cuando ejecuto el método Open_Instructions, pero cuando ejecuto el método Open_generic, la barra de progreso gira continuamente entre 20, 40 y 60% y no se completa. A continuación se muestra mi guión. Nota: he eliminado líneas no esenciales (?)

import os
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def Open_Instructions(self):
        self.timer = QtCore.QTimer(self.centralwidget)
        self.timer.timeout.connect(self.Increase_Instructions)
        self.timer.start(1000)
        url = 'https://github.com/Example'
        path = os.path.join(main_path,
                        'Manual',
                        'Example.pdf')
        open_resource(path, url)

    def Increase_Instructions(self):
        self.progressBar.setValue(self.progressBar.value()+20)

    def reset(self):
        self.progressBar.setValue(0)

    def Open_Generic(self):
        self.timer = QtCore.QTimer(self.centralwidget)
        self.timer.timeout.connect(self.reset)
        self.timer.timeout.connect(self.Increase_Instructions)
        self.timer.start(2000)
        path = os.path.join(main_path,
                        'Resources',
                        'Generic_Example.pdf')
        open_resource(path)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(521, 704)
        MainWindow.setStyleSheet("background-color: rgb(235, 235, 235);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.progressBar = QtWidgets.QProgressBar(MainWindow)
        self.progressBar.setGeometry(128, 670, 300, 25)
        self.progressBar.setProperty("value", 0)
        self.progressBar.setMaximum(100)
        self.progressBar.setValue(0)
    
        self.Instruction_Button = QtWidgets.QPushButton(self.centralwidget)
        self.Instruction_Button.setGeometry(QtCore.QRect(55, 210, 141, 31))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        font.setBold(True)
        self.Instruction_Button.setFont(font)
        self.Instruction_Button.clicked.connect(self.Open_Instructions)
        self.Instruction_Button.setObjectName("Instruction_Button")
        self.Instruction_Button.raise_()
    
        self.Generic_Datasheet_Button = QtWidgets.QPushButton(self.centralwidget)
        self.Generic_Datasheet_Button.setGeometry(QtCore.QRect(310, 450, 161, 31))
        font = QtGui.QFont()
        font.setFamily("Arial")
        font.setPointSize(12)
        font.setBold(True)
        font.setWeight(75)
        self.Generic_Datasheet_Button.setFont(font)
        self.Generic_Datasheet_Button.setText("Generic datasheet")
        self.Generic_Datasheet_Button.setObjectName("Generic_Datasheet_Button")
        self.Generic_Datasheet_Button.clicked.connect(self.Open_Generic)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
0
Trincatalyst 20 jul. 2020 a las 17:14

1 respuesta

La mejor respuesta

Si desea restablecer el valor de la barra de progreso, debe verificar si ha alcanzado su máximo; Si también desea retrasar el reinicio, necesitará otro temporizador diferente para hacerlo, teniendo cuidado de detenerlo tan pronto como se inicie un nuevo proceso: si el temporizador de reinicio tiene un intervalo mayor que el que aumenta el valor, puede restablecer la barra de progreso mientras ya muestra un valor mayor que 0.

Tenga en cuenta que debe reutilizar los temporizadores existentes y no crear uno nuevo cada vez, de lo contrario, terminará con varios temporizadores simultáneos.

from PyQt5 import QtCore, QtWidgets

class Test(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout(self)
        self.resetRadio = QtWidgets.QRadioButton('Reset after end')
        layout.addWidget(self.resetRadio)
        self.resetRadio.setChecked(True)
        self.keepRadio = QtWidgets.QRadioButton('Keep value after end')
        layout.addWidget(self.keepRadio)
        self.startButton = QtWidgets.QPushButton('Start')
        layout.addWidget(self.startButton)
        self.startButton.clicked.connect(self.startTimer)

        self.progressBar = QtWidgets.QProgressBar()
        layout.addWidget(self.progressBar)

        self.timer = QtCore.QTimer(interval=1000, timeout=self.timeout)
        self.resetTimer = QtCore.QTimer(interval=2000, timeout=self.progressBar.reset, singleShot=True)

    def startTimer(self):
        # stop the reset timer if it's running
        self.resetTimer.stop()
        self.progressBar.setValue(0)
        self.timer.start()

    def timeout(self):
        if self.progressBar.value() == self.progressBar.maximum():
            # the maximum has been reached, stop the timer
            self.timer.stop()
            if self.resetRadio.isChecked():
                # we are going to reset the progress bar, let's start the timer
                # that will do that
                self.resetTimer.start()
        else:
            # increase the value
            self.progressBar.setValue(self.progressBar.value() + 20)


if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Test()
    w.show()
    sys.exit(app.exec_())
0
musicamante 20 jul. 2020 a las 15:42