pyqt5多个多线程实现
时间: 2024-09-13 19:08:04 浏览: 51
【源代码】Pythone+PyQt5+爬虫+多线程 : 豆瓣陶书工具(GUI)
5星 · 资源好评率100%
在PyQt5中,可以使用Python的`threading`模块来创建多个线程。每个线程都可以执行特定的任务,而主线程可以继续处理GUI相关的操作,这样可以避免程序界面在处理耗时操作时出现冻结。下面是一个简单的多线程实现示例:
首先,需要从`threading`模块导入`Thread`类,并定义一个继承自`Thread`的子类,用于封装你希望在单独线程中运行的代码。
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PyQt5.QtCore import QThread, pyqtSignal
import sys
import time
class Worker(QThread):
# 创建信号,用于在子线程和主线程之间传递消息
update_signal = pyqtSignal(str)
def __init__(self, data):
super().__init__()
self.data = data
def run(self):
# 在这里编写线程要执行的任务
for x in range(10):
time.sleep(1)
self.update_signal.emit(f"{self.data}的进度: {x+1}/10")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('PyQt5 多线程示例')
self.setGeometry(100, 100, 280, 80)
layout = QVBoxLayout()
self.button = QPushButton('开始任务')
self.label = QLabel('点击按钮开始任务')
layout.addWidget(self.button)
layout.addWidget(self.label)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
self.worker = Worker('线程1')
self.worker.update_signal.connect(self.update_ui)
self.button.clicked.connect(self.start_thread)
def start_thread(self):
self.worker.start() # 启动线程
def update_ui(self, message):
self.label.setText(message)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在这个例子中,`Worker`类继承自`QThread`,在其`run`方法中实现要执行的线程任务,这里是模拟一个耗时的任务,并通过信号`update_signal`发送进度信息。`MainWindow`类中创建了一个`Worker`实例,并将信号连接到主窗口的`update_ui`槽函数中,以便更新GUI。
注意,`QThread`的`start`方法会将`run`方法的调用放到一个新的线程中执行。主线程仍然可以响应GUI事件,如按钮点击等。
阅读全文