如何将matplotlib图表嵌入Tkinter GUI并绘制Arduino串口ECG实时数据
问题根源
你在绘图逻辑中调用了plt开头的全局pyplot接口,这类接口默认会创建独立的matplotlib画布窗口,不会渲染到你提前绑定到Tkinter组件的fig、ax对象上。
修复方案
直接修改start_plot函数,将所有plt开头的操作替换为你已经实例化的ax(子图对象)、fig(画布对象)、canvas(Tkinter绑定的画布组件)操作即可,修改后的函数代码如下:
def start_plot(): data = np.array([]) while True: a = s.readline() a.decode() b = float(a[0:4]) data = np.append(data, b) # 替换plt全局操作为已绑定Tkinter的ax对象操作 ax.cla() ax.plot(data) # 补充ax的样式配置(cla操作会清空之前设置的标题、坐标轴、网格规则) ax.set_title("Electrocadiogram") ax.set_xlabel("Time(Sec)") ax.set_ylabel("Voltage(mV)") ax.set_xlim(0, 200) ax.set_ylim(-0.5, 6) ax.grid(b=True, which='major', color='#666666', linestyle='-') ax.minorticks_on() ax.grid(b=True, which='minor', color='#666666', linestyle='-', alpha=0.2) # 刷新Tkinter中的画布,替换原plt.pause操作 canvas.draw() canvas.flush_events() time.sleep(0.01) s.close()
补充说明
如果后续出现GUI无响应的卡顿问题,是因为while死循环阻塞了Tkinter的主事件调度,可将串口读取、绘图逻辑改用Tkinter自带的after定时器实现异步调度即可,不影响当前核心需求的实现。
内容的提问来源于stack exchange,提问作者Kennerdol
相关产品推荐
相关产品推荐

