Python - Многопоточность не работает (Pulse ProgressBar) - PullRequest
0 голосов
/ 06 июня 2018

В моей программе (PyQT) мне нужно выполнить тяжелую операцию, и я хочу отображать индикатор (в данном случае индикатор выполнения) во время процесса.Индикатор выполнения можно установить в «Режим ожидания», выполнив self.progressBar.setRange (0,0) .

Проблема: Мой бар всегда идет от 0 (даже не запущен) до 100 (Готово).Никогда не установлен в «Режим ожидания».Я использую глобальную переменную, чтобы увидеть, завершен ли процесс, и передать информацию обоим классам или потокам.

Вот код.

# Link to GUI
qtCreatorFile = "interaface.ui"     
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)

ready = False

class Process(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent = None):

    # Setting-ip UI
    QtGui.QMainWindow.__init__(self)
    Ui_MainWindow.__init__(self)
    self.setupUi(self)

    # Setting Progress Bar to 0 and initial message
    self.progressBar.setValue(0)
    self.resultLabel.setText("Not ready")        

    # Button
    self.runButton.clicked.connect(self.onStart)

    # Thread
    self.myLongTask = TaskThread()
    self.myLongTask.taskFinished.connect(self.onFinished)

    def onStart(self):
        global ready
        ready = False

        print "Activate Waiting Bar Mode and message"
        self.progressBar.setRange(0,0)
        self.resultLabel.setText("Wait")        
        print "Deactivate Waiting Bar Mode and message"

        print "INITIALIZE THREAD"
        self.myLongTask.start()

        # Simulate heavy process
        print "DOING TASK..."
        i = 1
        for i in range (9999999):
            u = i*2 
        ready = True
        print "TASK DONE"

    def onFinished(self):
        print "onFinished executed and set Progress Bar to 1"
        self.progressBar.setRange(0,1)
        self.progressBar.setValue(1)
        self.resultLabel.setText("Done")        

class TaskThread(QtCore.QThread):
    taskFinished = QtCore.pyqtSignal()
    def run(self):
        global ready
        temp = True
        while temp == True:
            if ready == False:
                print "(THREAD)Process not finished yet"
            else:
                print "(THREAD)Process done"
                self.taskFinished.emit()
                temp = False  

def main():
    app = QtGui.QApplication(sys.argv)
    window = BagTool()
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

PS.Я использую .ui для интерфейса.У меня есть только QPushButton и QProgressBar

Процесс должен быть: 1- Изначально бар на 0 2- Нажать кнопку.Запустите процесс, и панель начнет двигаться. 3- Когда процесс завершится, панель будет завершена.

Если вы запустите код (с интерфейсом, имеющим эти два QWidget), вы увидите, что процесс занимает, возможно, одну секунду, НОв течение этой секунды индикатор прогресса всегда остается равным 0 (в этом режиме ожидания он должен перемещаться с одной стороны на другую).Когда он заканчивается, на панели отображается 1 и сообщение «Готово».

Что я делаю не так?Спасибо за помощь!

...