如何从另一个模块更新 QProgressbar?
How to update QProgressbar from another module?
我想从另一个模块更新主 gui class 中的进度条。由于必须更新进度条值,而 gui 在其主事件循环中仍为 运行,因此我为其创建了一个线程。我无法从线程更新进度值。
这只是我真正想做的事情的基本代码,但它会产生同样的错误。
progress.py
from time import sleep
from PyQt5.QtCore import QObject, pyqtSignal
class ProgressUpdate(QObject):
progress_signal = pyqtSignal(int)
def __init__(self):
super().__init__()
self.progress_update()
def progress_update(self):
for i in range(0, 101):
self.progress_signal.emit(i)
sleep(0.01)
main.py
from PyQt5.QtWidgets import QVBoxLayout, QApplication, QProgressBar, QWidget
from PyQt5 import QtCore
import sys
from progress import ProgressUpdate
class Example(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.progress_bar = QProgressBar(self)
self.vbox = QVBoxLayout(self)
self.vbox.addWidget(self.progress_bar)
self.setLayout(self.vbox)
self.setWindowTitle('Progress')
self.p_thread = ProgressThread()
self.p_thread.start()
self.show()
def update_progress(self, val):
self.progress_bar.setValue(val)
class ProgressThread(QtCore.QThread):
def __init__(self):
super().__init__()
def run(self):
self.obj = ProgressUpdate()
self.obj.progress_signal.connect(Example.update_progress)
def main():
app = QApplication(sys.argv)
p = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
当我运行这个时候,进度条出现了,但是一直是0,没有更新。
您不需要单独的 QObject 和线程,这使得正确连接信号和槽变得更加困难。 progress.py 文件可以包含带有循环的 QThread,以在每个时间间隔发出值。
class ProgressThread(QtCore.QThread):
progress_signal = pyqtSignal(int)
def __init__(self):
super().__init__()
def run(self):
for i in range(0, 101):
self.progress_signal.emit(i)
sleep(0.01)
并且在 main.py 中,将信号从线程连接到 class 中的插槽。
class Example(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.progress_bar = QProgressBar(self)
self.vbox = QVBoxLayout(self)
self.vbox.addWidget(self.progress_bar)
self.setLayout(self.vbox)
self.setWindowTitle('Progress')
self.p_thread = ProgressThread()
self.p_thread.progress_signal.connect(self.update_progress)
self.p_thread.start()
self.show()
def update_progress(self, val):
self.progress_bar.setValue(val)
def main():
app = QApplication(sys.argv)
p = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
我想从另一个模块更新主 gui class 中的进度条。由于必须更新进度条值,而 gui 在其主事件循环中仍为 运行,因此我为其创建了一个线程。我无法从线程更新进度值。
这只是我真正想做的事情的基本代码,但它会产生同样的错误。
progress.py
from time import sleep
from PyQt5.QtCore import QObject, pyqtSignal
class ProgressUpdate(QObject):
progress_signal = pyqtSignal(int)
def __init__(self):
super().__init__()
self.progress_update()
def progress_update(self):
for i in range(0, 101):
self.progress_signal.emit(i)
sleep(0.01)
main.py
from PyQt5.QtWidgets import QVBoxLayout, QApplication, QProgressBar, QWidget
from PyQt5 import QtCore
import sys
from progress import ProgressUpdate
class Example(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.progress_bar = QProgressBar(self)
self.vbox = QVBoxLayout(self)
self.vbox.addWidget(self.progress_bar)
self.setLayout(self.vbox)
self.setWindowTitle('Progress')
self.p_thread = ProgressThread()
self.p_thread.start()
self.show()
def update_progress(self, val):
self.progress_bar.setValue(val)
class ProgressThread(QtCore.QThread):
def __init__(self):
super().__init__()
def run(self):
self.obj = ProgressUpdate()
self.obj.progress_signal.connect(Example.update_progress)
def main():
app = QApplication(sys.argv)
p = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
当我运行这个时候,进度条出现了,但是一直是0,没有更新。
您不需要单独的 QObject 和线程,这使得正确连接信号和槽变得更加困难。 progress.py 文件可以包含带有循环的 QThread,以在每个时间间隔发出值。
class ProgressThread(QtCore.QThread):
progress_signal = pyqtSignal(int)
def __init__(self):
super().__init__()
def run(self):
for i in range(0, 101):
self.progress_signal.emit(i)
sleep(0.01)
并且在 main.py 中,将信号从线程连接到 class 中的插槽。
class Example(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
self.progress_bar = QProgressBar(self)
self.vbox = QVBoxLayout(self)
self.vbox.addWidget(self.progress_bar)
self.setLayout(self.vbox)
self.setWindowTitle('Progress')
self.p_thread = ProgressThread()
self.p_thread.progress_signal.connect(self.update_progress)
self.p_thread.start()
self.show()
def update_progress(self, val):
self.progress_bar.setValue(val)
def main():
app = QApplication(sys.argv)
p = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()