You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,会导致内部调用曲线相关方法时出错。

修正步骤

  1. 恢复创建LiveLinePlot曲线对象的代码,并将其添加到LivePlotWidget中
  2. 将DataConnector关联到LiveLinePlot对象,而非LivePlotWidget
  3. 增加串口数据的有效性判断,避免空数据或格式错误导致崩溃

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:27:13