pyqt界面程序如何防止处理需要长时间运行的函数
时间: 2023-12-14 11:36:11 浏览: 135
在处理需要长时间运行的函数时,可以使用多线程技术来避免界面程序的阻塞。具体地,可以将长时间运行的函数放在一个新的线程中运行,这样就可以避免界面程序因为等待函数执行完成而阻塞。
下面是一个使用多线程技术的示例代码:
```python
import threading
from PyQt5.QtCore import pyqtSignal, QObject
class Worker(QObject):
finished = pyqtSignal()
progress = pyqtSignal(int)
def __init__(self, parent=None):
super().__init__(parent)
def run(self):
# 长时间运行的函数
for i in range(100):
self.progress.emit(i)
self.finished.emit()
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.worker = None
self.initUI()
def initUI(self):
btn = QPushButton('Start', self)
btn.clicked.connect(self.start)
def start(self):
self.worker = Worker()
self.worker.finished.connect(self.onFinished)
self.worker.progress.connect(self.onProgress)
self.workerThread = threading.Thread(target=self.worker.run)
self.workerThread.start()
def onFinished(self):
self.workerThread.quit()
self.workerThread.wait()
self.worker = None
print('Finished')
def onProgress(self, value):
print(f'Progress: {value}')
```
在这个示例代码中,我们创建了一个 `Worker` 类,该类继承自 `QObject` 类。`Worker` 类中包含了一个长时间运行的函数 `run()`,该函数会发出 `progress` 信号和 `finished` 信号,用于更新进度条和通知任务完成。
在主窗口中,我们连接了一个 `QPushButton`,点击该按钮会启动一个新的线程来执行 `Worker` 类中的 `run()` 函数。在启动线程时,我们还连接了 `progress` 信号和 `finished` 信号,用于更新界面和通知任务完成。
需要注意的是,在使用多线程时,需要确保线程安全。具体地,在多个线程中访问同一个对象时,需要使用锁来避免竞态条件的出现。
阅读全文