python gui 多线程
时间: 2023-06-21 12:04:38 浏览: 124
python实现多线程的两种方式
在 Python 的 GUI 库中,例如 PyQt 或 Tkinter,可以使用多线程来避免长时间运行的操作冻结图形用户界面。以下是一个使用 PyQt 的例子:
```python
import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton, QLabel
class WorkerThread(QThread):
finished = pyqtSignal() # 自定义信号
def __init__(self):
super().__init__()
def run(self):
# 执行长时间运行的操作
self.sleep(5)
self.finished.emit() # 发送自定义信号
class GUI(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('GUI with Threading')
layout = QVBoxLayout()
self.label = QLabel('Click the button to start the task')
layout.addWidget(self.label)
button = QPushButton('Start Task', self)
button.clicked.connect(self.startTask)
layout.addWidget(button)
self.setLayout(layout)
def startTask(self):
self.label.setText('Task started')
self.thread = WorkerThread()
self.thread.finished.connect(self.taskComplete) # 连接自定义信号和槽函数
self.thread.start()
def taskComplete(self):
self.label.setText('Task complete')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = GUI()
window.show()
sys.exit(app.exec_())
```
这个例子中,GUI 类继承自 QWidget,它包含了一个 QLabel 和一个 QPushButton。当用户点击按钮时,startTask 方法会创建一个 WorkerThread 的实例并启动它。WorkerThread 继承自 QThread,它执行长时间运行的操作并在完成后发送自定义信号 finished。GUI 类连接了这个信号和槽函数 taskComplete,在任务完成后更新标签的文本。注意到长时间的操作不应该直接在 GUI 线程中执行,因为这样会阻塞图形用户界面。相反,我们应该将操作放到单独的线程中。
阅读全文