Obecnie jestem w trakcie tworzenia podstawowych GUI, które wiąże się ze sobą niektóre skrypty analizy danych. Te skrypty mogą przyjmować (w zależności od wprowadzonych danych) kilka minut do uruchomienia i miałem nadzieję włączyć pasek postępu do GUI w celu potwierdzenia, że skrypty są uruchomione.

Jednak jako sam nauczony Python (ER) mam pewne trudności z wdrażaniem rozwiązań moim problemem. Mogę zaktualizować pasek postępu, gdy uruchamiam metodę Open_instructions, ale kiedy uruchomię metodę Open_Generic Pasek postępowy ciągle cykle od 20, 40 do 60% i nie ukończy. Poniżej znajduje się mój skrypt. Uwaga - usunęłam linie nieistotne (?)

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 lipiec 2020, 17:14

1 odpowiedź

Najlepsza odpowiedź

Jeśli chcesz zresetować wartość paska postępu, musisz sprawdzić, czy osiągnął maksimum; Jeśli chcesz również opóźnić reset, będziesz potrzebować inny , aby to zrobić, uważając, aby zatrzymać go, gdy tylko nowy proces zostanie uruchomiony: jeśli zegar resetowy ma większy odstęp niższy niż Ten, który zwiększa wartość, może zresetować pasek postępu, podczas gdy jest on już większy niż 0.

Należy pamiętać, że powinieneś ponownie używać istniejących timerów, a nie tworzyć nowego za każdym razem, w przeciwnym razie skończysz z wieloma równoległymi timerami.

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 lipiec 2020, 15:42