PyQt5 是一组 Python 绑定 Qt 库的 Python 模块,支持开发界面程序。通过多线程操作可以提升程序的运行效率和用户体验。以下是一份关于 PyQt5 多线程操作入门的攻略。
在开发 PyQt5 多线程程序前,我们需要先准备好以下两个软件的安装:
Python 3.x。可前往官网下载并安装。
PyQt5 模块。使用 pip 命令安装,终端输入:
pip install PyQt5
import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton
class MyThread(QThread):
"""自定义线程类"""
thread_signal = pyqtSignal(int)
def __init__(self, start=1, end=100):
super().__init__()
self.start_value = start
self.end_value = end
def run(self):
"""线程任务"""
for i in range(self.start_value, self.end_value):
self.thread_signal.emit(i)
class MainWindow(QMainWindow):
"""主窗口类"""
def __init__(self):
super().__init__()
self.p_bar = QProgressBar(self)
self.p_bar.setGeometry(50, 70, 200, 25)
self.btn = QPushButton("Start", self)
self.btn.setGeometry(80, 120, 120, 25)
self.thread = MyThread()
self.thread.thread_signal.connect(self.update_progress)
self.btn.clicked.connect(self.thread.start)
self.setGeometry(300, 300, 300, 200)
def update_progress(self, value):
"""更新进度条"""
self.p_bar.setValue(value)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
该示例程序创建了一个新的线程,该线程从 start 到 end 值间的整数依次输出。点开开始按钮,线程任务在新线程中执行,同时主窗口中的进度条也会相应更新。通过这个示例,我们可以了解到,QThread 是实现线程操作的一种常用方式。
import sys
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot, QThread
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QPushButton
class MyWorker(QObject):
"""基于QObject的工作进程"""
progress_changed = pyqtSignal(int)
@pyqtSlot()
def do_work(self):
"""工作任务"""
for i in range(1, 101):
self.progress_changed.emit(i)
class MyThread(QThread):
"""基于QThread的线程类"""
def __init__(self, worker):
super().__init__()
self.worker = worker
def run(self):
"""线程任务"""
self.worker.do_work()
class MainWindow(QMainWindow):
"""主窗口类"""
def __init__(self):
super().__init__()
self.p_bar = QProgressBar(self)
self.p_bar.setGeometry(50, 70, 200, 25)
self.btn = QPushButton("Start", self)
self.btn.setGeometry(80, 120, 120, 25)
self.worker = MyWorker()
self.thread = MyThread(self.worker)
self.worker.progress_changed.connect(self.update_progress)
self.btn.clicked.connect(self.thread.start)
self.setGeometry(300, 300, 300, 200)
def update_progress(self, value):
"""更新进度条"""
self.p_bar.setValue(value)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
该示例程序创建了一个新的线程,该线程启动 worker 任务,并且基于 Qt 的 QObject 类来实现报告信号和进度 moved 信号。点开开始按钮,线程任务在新线程中执行,同时主窗口中的进度条也会相应更新。通过这个示例,我们可以了解到,QObject 和 QThread 是共同实现多线程操作的最佳方式。
通过上述的两个示例,我们了解并应用了 QThread 和 QObject 类多线程操作的实现方式。当我们需要同时处理和展示大量的数据时,多线程操作可以有效提高我们的程序效率和用户体验。