pyqt5多线程优化_PyQt5多线程防卡死和多窗口用法的实现
时间: 2023-07-26 22:07:49 浏览: 139
在PyQt5中,多线程可以使用QThread类来实现。为了避免卡死界面,我们需要在主线程中创建一个QThread实例,然后将需要执行的任务放到这个QThread实例中运行,这样就不会阻塞主线程。下面是一个简单的例子:
```python
import sys
import time
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel
class Worker(QThread):
update_signal = pyqtSignal(str)
def __init__(self):
super().__init__()
def run(self):
for i in range(10):
time.sleep(1)
self.update_signal.emit(f"Task {i} finished.")
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setGeometry(100, 100, 300, 200)
self.label = QLabel(self)
self.label.setGeometry(50, 50, 200, 30)
self.button = QPushButton("Start", self)
self.button.setGeometry(100, 100, 100, 30)
self.button.clicked.connect(self.start_task)
self.worker = Worker()
self.worker.update_signal.connect(self.update_label)
def start_task(self):
self.button.setEnabled(False)
self.worker.start()
def update_label(self, message):
self.label.setText(message)
if message == "Task 9 finished.":
self.button.setEnabled(True)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
在这个例子中,我们创建了一个Worker类作为子线程,每隔1秒发送一个更新信号,主线程中创建一个QMainWindow实例,包含一个标签和一个按钮。当点击按钮时,启动子线程执行任务,同时禁用按钮,防止重复执行。当任务完成后,更新标签内容,并启用按钮。
在多窗口应用中,我们可以使用QThread类来创建独立的线程,每个窗口都有自己的线程,这样就不会阻塞其他窗口的操作。这个需要根据实际情况进行具体的实现。
阅读全文