ошибка при использовании QProgressbar PyQt5 python

у меня есть следующий код, в котором я реализовал QprogressDialog, он отлично работает при первом нажатии кнопки «Пуск», чтобы запустить функцию создания, но если диалоговое окно завершается, и я пытаюсь запустить его снова, он показывает пустую полосу, которая не увеличивает прогресс . Любые идеи?

      from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import sys
import time


class Worker(QObject):
    signal = pyqtSignal(int)

    def __init__(self):
        super().__init__()
    @pyqtSlot()
    def do_work(self) -> None:
        for value in range(1,101):
            self.signal.emit(value)
            time.sleep(0.01)
        

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.layout = QVBoxLayout()
        self.con = QWidget()
        self.setCentralWidget(self.con)
        self.con.setLayout(self.layout)
        self.btn = QPushButton("Start",self)
        self.layout.addWidget(self.btn)
        self.thread = QThread()
        self.thread.finished.connect(self.thread_finished)
        self.btn.pressed.connect(self.create)


    def create(self):
        self.p = QProgressDialog("Names", "Cancel", 0, 100)
        self.p.setValue(0)
        self.p.setWindowModality(Qt.ApplicationModal)
        self.p.canceled.connect(self.p.deleteLater)
        self.p.show()
        self.worker = Worker()
        self.worker.signal.connect(self.p.setValue)
        self.worker.moveToThread(self.thread)
        self.thread.started.connect(self.worker.do_work)
        self.thread.start()

        
        
    def thread_finished(self):
        self.thread.deletelater()
        # self.thread = QThread()
        # self.thread.finished.connect(self.thread_finished)



app = QApplication(sys.argv)
window = Window()
window.show()
app.exec_()

я пытался сделать диалог локальной переменной, но он тоже не работает

1 ответ

Когдаdo_workзавершается, он просто возвращается, но поток все еще жив, поэтому при повторном вызове ничего не происходит start():

Если поток уже запущен, эта функция ничего не делает.

Кроме того, удаление и повторное создание диалога или треда бессмысленно. В лучшем случае вам нужно заново создать рабочего (при условии, что у него есть некоторые атрибуты экземпляра, которые не будут использоваться снова при перезапуске), но самая важная часть заключается в том, что вы должны указать потокуquit()когда ваша функция заканчивается, используя сигнал в рабочем объекте.

      class Worker(QObject):
    signal = pyqtSignal(int)
    finished = pyqtSignal()

    @pyqtSlot()
    def do_work(self) -> None:
        self.keepRunning = True
        for value in range(1,101):
            if not self.keepRunning:
                break
            self.signal.emit(value)
            time.sleep(0.01)
        self.finished.emit()

    def stop(self):
        self.keepRunning = False


class Window(QMainWindow):
    def __init__(self):
        # ...
        self.p = QProgressDialog("Names", "Cancel", 0, 100)
        self.p.setWindowModality(Qt.ApplicationModal)

    def create(self):
        self.p.show()

        self.worker = Worker()
        self.worker.signal.connect(self.p.setValue)
        self.p.canceled.connect(self.worker.stop)

        self.worker.moveToThread(self.thread)
        self.worker.finished.connect(self.thread.quit)

        self.thread.started.connect(self.worker.do_work)
        self.thread.finished.connect(self.worker.deleteLater)
        self.thread.start()

Примечание: то, что у вас было, было проблемой, а не ошибкой.

Другие вопросы по тегам