PySimpleGUI 集成 matplotlib 画图 动态显示

文章介绍了如何在时间紧迫的情况下,利用pysimplegui而不是更复杂的pyqt来创建一个配置界面。该界面包含波形显示功能,并通过matplotlib进行图形绘制。在主函数中,通过调用draw()方法更新画布,使用clear()防止波形重叠,以及重新绘制波形以实现动态更新。同时,文章指出了在嵌入式使用matplotlib时,plot.pause()函数可能导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缘由:设备需要做一个界面,配置参数,而且校准需要波形显示,本来想用pyqt 的但是时间有点紧,暂时就用 pysimplegui 凑合,虽然丑一点

实现:

  1. 常规的按钮,对话框
  2. 实现网络等
  3. 实现嵌入到画布的plot 且可以自动更新

效果如下图:
在这里插入图片描述

关键代码:

def make_figure(): # 初始化条用
    global  x,y
    global fig
    x = np.arange(0, 3, .01)
    y = 2 * np.sin(2 * np.pi * x)
    max_index = np.argmax(y)
    min_index = np.argmin(y)
    fig = plt.figure(facecolor="lightgray")
    plt.grid(True)

    #plt.plot(max_index/29, y[max_index], 'ks')
    #plt.plot(min_index/29, y[min_index], 'gs')
    #plt.plot(x, y)
    plt.title(u"matplot 测试")
    plt.xlabel('x')
    plt.ylabel('y')

    # 用来正常显示中文标签
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 用来正常显示负号
    plt.rcParams['axes.unicode_minus'] = False
    return fig

def make_figure1():# 更新波形需每次调用
    global  x,y
    global fig

    max_index = np.argmax(y)
    min_index = np.argmin(y)

    plt.grid(True)
    plt.plot(max_index/29, y[max_index], 'rs')
    plt.plot(min_index/29, y[min_index], 'gs')
    #plt.plot(x, y)
    plt.title(u"matplot ")
    plt.xlabel('x')
    plt.ylabel('y')

    # 用来正常显示中文标签
    plt.rcParams['font.sans-serif'] = ['SimHei']
    # 用来正常显示负号
    plt.rcParams['axes.unicode_minus'] = False
    return fig
#画在canvas上,包括工具条(工具条屏蔽掉了)
def draw_figure(canvas,canvas_toolbar, figure):
    global figure_canvas_agg
    global toolbar

    figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
    figure_canvas_agg.draw()
    #toolbar = NavigationToolbar2Tk(figure_canvas_agg,canvas_toolbar)
    #toolbar.update()
    figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
    return figure_canvas_agg

主函数:


            x = np.arange(0, 4, .01)  #重新更新数据
            y =np.sin(2 * np.pi * x)+ random.uniform(1.1,1.4)

            figure_canvas_agg.draw() # 更新画布
            fig.clear()  # 防止波形重叠
            make_figure1() #重新绘制波形
            plt.plot(x, y)
   

遇到的问题:
1.图像不能更新的问题
解决:
我们在主函数中调用
figure_canvas_agg.draw() # 更新画布
plt.plot(x, y)
2.图像覆盖的问题
解决;
fig.clear() # 防止波形重叠
make_figure1() #重新绘制波形
3.出现两个plot 同步更新的 波形
主要因为在主函数中调用了plot.pause(0.01) 这个函数在普通的动图中有用,但是这种嵌入式的使用方式上会出问题

PySimpleGUI 是一款基于 Python 的 GUI 框架,而 matplotlib 则是一个强大的 Python 画图库。这篇文章将介绍如何在 PySimpleGUI集成 matplotlib 画图。 步骤一:安装依赖库 首先需要安装 PySimpleGUImatplotlib 两个库,可以使用以下命令进行安装: ```python pip install PySimpleGUI pip install matplotlib ``` 步骤二:创建 PySimpleGUI 窗口 接下来需要创建一个 PySimpleGUI 窗口,用于显示 matplotlib 画出的图形。可以使用以下代码创建一个简单的窗口: ```python import PySimpleGUI as sg sg.theme('Dark Blue 3') layout = [[sg.Graph((500, 500), (0, 0), (500, 500), key='graph')]] window = sg.Window('Matplotlib Integration', layout, resizable=True, finalize=True) graph = window['graph'] ``` 这个窗口只包含一个 Graph 对象,用于显示 matplotlib 画出的图形。 步骤三:使用 matplotlib 画图 接下来需要使用 matplotlib 画图。在 PySimpleGUI集成 matplotlib 最简单的方法是使用 FigureCanvasTkAgg 类。以下是一个简单的例子,用于在 PySimpleGUI 窗口中显示一条直线: ```python import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg fig, ax = plt.subplots() ax.plot([0, 1, 2, 3], [0, 1, 4, 9]) canvas = FigureCanvasTkAgg(fig, graph.TKCanvas) canvas.draw() canvas.get_tk_widget().pack(side='top', fill='both', expand=1) ``` 这段代码首先创建了一个 Figure 对象和一个 Axes 对象,然后使用 plot 方法画了一条直线。接着,创建了一个 FigureCanvasTkAgg 对象,它可以将 matplotlib 的图形绘制在 PySimpleGUI 窗口中的 Graph 对象上。最后,调用 draw 方法将图形绘制到 FigureCanvasTkAgg 对象上,并将它添加到 Graph 对象中。 步骤四:运行程序 最后,需要使用 PySimpleGUI 的事件循环处理器运行程序,以便可以响应用户的操作。以下是一个简单的例子: ```python while True: event, values = window.read() if event == sg.WIN_CLOSED: break window.close() ``` 这个程序会一直循环,直到用户关闭窗口。在每次循环中,它调用 read 方法来等待用户的操作。如果用户关闭了窗口,程序会退出循环,并调用 close 方法关闭窗口。 完整代码: ```python import PySimpleGUI as sg import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg sg.theme('Dark Blue 3') layout = [[sg.Graph((500, 500), (0, 0), (500, 500), key='graph')]] window = sg.Window('Matplotlib Integration', layout, resizable=True, finalize=True) graph = window['graph'] fig, ax = plt.subplots() ax.plot([0, 1, 2, 3], [0, 1, 4, 9]) canvas = FigureCanvasTkAgg(fig, graph.TKCanvas) canvas.draw() canvas.get_tk_widget().pack(side='top', fill='both', expand=1) while True: event, values = window.read() if event == sg.WIN_CLOSED: break window.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nyiragongo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值