ошибка при использовании 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()
Примечание: то, что у вас было, было проблемой, а не ошибкой.