我现在有一个ui界面主要做两个事,一个是使用QtCore.QTimer()每10毫秒更新一次串口数据绘制的图像,另一个是按下按键后调用另一个程序接收串口数据并将串口数据进行写入excel并处理数据。现在的问题是按下按键后绘图就停止工作了,有什么办法可以让他们之间同时进行吗
时间: 2024-03-12 22:43:37 浏览: 16
您可以将串口数据的接收和写入excel的代码放在一个线程中,这样就可以不影响UI界面的绘制。在按下按键时启动这个线程,并在绘图的部分使用信号与槽机制,将每次更新的数据通过信号发送给UI线程,由UI线程进行绘制。这样就可以实现同时进行。同时,为了确保线程安全,您需要使用线程锁来保护共享的数据。以下是示例代码:
```python
import threading
from PyQt5.QtCore import QTimer, QObject, pyqtSignal
class DataThread(QObject):
data_changed = pyqtSignal(list)
def __init__(self, lock):
super().__init__()
self.lock = lock
self.stop_flag = False
def run(self):
while not self.stop_flag:
# 接收串口数据并写入excel
with self.lock:
# 处理数据
processed_data = []
# 发送信号
self.data_changed.emit(processed_data)
# 等待一段时间
time.sleep(0.01)
def stop(self):
self.stop_flag = True
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.lock = threading.Lock()
self.init_ui()
def init_ui(self):
# 创建定时器
self.timer = QTimer(self)
self.timer.timeout.connect(self.update_chart)
self.timer.start(10)
# 创建数据线程
self.data_thread = DataThread(self.lock)
self.data_thread.data_changed.connect(self.update_data)
# 创建按键
self.button = QPushButton('开始处理数据', self)
self.button.clicked.connect(self.start_data_thread)
def start_data_thread(self):
# 启动数据线程
self.data_thread.start()
def update_data(self, data):
# 更新数据
with self.lock:
# 更新图像
pass
def update_chart(self):
# 更新图像
pass
def closeEvent(self, event):
# 关闭窗口时停止线程
self.data_thread.stop()
event.accept()
```