Qt Designer与pglive集成实时绘图报错求助
问题描述
已通过pglive实现实时正弦曲线和Arduino串口数据绘图,现在想集成Qt Designer制作的GUI,将ui中的plot1提升为LivePlotWidget后,运行代码出现以下报错:
Traceback (most recent call last): File "C:\Users\New Wyss User\AppData\Roaming\Python\Python311\site-packages\pglive\sources\live_plot.py", line 134, in <lambda> plot.slot_roll_tick = lambda data_connector, tick: plot.plot_widget.slot_roll_tick(data_connector, tick) ^^^^^^^^^^^^^^^^ AttributeError: plot_widget Traceback (most recent call last): File "C:\Users\New Wyss User\AppData\Roaming\Python\Python311\site-packages\pglive\sources\live_plot.py", line 121, in <lambda> plot.slot_new_data = lambda y, x, kwargs: plot.setData(x, y, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: setData(self, key: int, value: Any): argument 1 has unexpected type 'numpy.ndarray'
使用的代码如下:
import sys from math import sin from threading import Thread from time import sleep from PyQt5.QtWidgets import QApplication from PyQt5 import QtWidgets, QtCore, uic from pglive.sources.data_connector import DataConnector from pglive.sources.live_plot import LiveLinePlot from pglive.sources.live_plot_widget import LivePlotWidget import serial arduino = serial.Serial(port='COM17', baudrate=9600, timeout=.1) app = QApplication(sys.argv) running = True ui = uic.loadUi('test.ui') plot_widget = ui.plot1 # LivePlotWidget(title="Line Plot @ 100Hz") # plot_curve = LiveLinePlot() # plot_widget.addItem(plot_curve) # DataConnector holding 600 points and plots @ 100Hz data_connector = DataConnector(ui.plot1, max_points=600, update_rate=100) # data_connector = DataConnector(plot_curve, max_points=600, update_rate=100) def sin_wave_generator(connector): """Sine wave generator""" x = 0 while running: x += 1 data = arduino.readline().decode("utf-8") # retrieve serial data from feather values = data.split(",") # split at commas data_point = float(values[0]) # Callback to plot new data point connector.cb_append_data_point(data_point, x) sleep(0.01) plot_widget.show() Thread(target=sin_wave_generator, args=(data_connector,)).start() app.exec() running = False
解决建议
核心问题
DataConnector的初始化参数需要的是**LivePlot子类对象(比如LiveLinePlot)**,而不是LivePlotWidget容器。直接把ui.plot1(LivePlotWidget)传给DataConnector,会导致内部调用曲线相关方法时出错。
修正步骤
- 恢复创建
LiveLinePlot曲线对象的代码,并将其添加到LivePlotWidget中 - 将
DataConnector关联到LiveLinePlot对象,而非LivePlotWidget - 增加串口数据的有效性判断,避免空数据或格式错误导致崩溃
修正后的代码
import sys from threading import Thread from time import sleep from PyQt5.QtWidgets import QApplication from PyQt5 import uic from pglive.sources.data_connector import DataConnector from pglive.sources.live_plot import LiveLinePlot import serial arduino = serial.Serial(port='COM17', baudrate=9600, timeout=.1) app = QApplication(sys.argv) running = True ui = uic.loadUi('test.ui') # 获取Qt Designer中提升的LivePlotWidget plot_widget = ui.plot1 # 创建LiveLinePlot曲线并添加到widget中 plot_curve = LiveLinePlot() plot_widget.addItem(plot_curve) # 将DataConnector关联到LiveLinePlot对象 data_connector = DataConnector(plot_curve, max_points=600, update_rate=100) def serial_data_generator(connector): x = 0 while running: x += 1 data = arduino.readline().decode("utf-8").strip() # 去除首尾空白字符 if not data: sleep(0.01) continue try: values = data.split(",") data_point = float(values[0]) connector.cb_append_data_point(data_point, x) except (IndexError, ValueError): # 处理数据格式错误的情况 print(f"无效数据: {data}") sleep(0.01) # 显示整个UI窗口(而非单独的plot_widget) ui.show() Thread(target=serial_data_generator, args=(data_connector,)).start() app.exec() running = False arduino.close() # 关闭串口连接
额外注意事项
- 确保Qt Designer中
plot1的提升设置正确:类名是LivePlotWidget,头文件是pglive.sources.live_plot_widget - 串口数据读取时加入异常捕获,避免Arduino发送空数据或格式错误导致程序崩溃
- 程序退出时记得关闭串口连接,释放资源
内容的提问来源于stack exchange,提问作者Sfrow
相关产品推荐
相关产品推荐

