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

点击按钮重复生成Matplotlib图表问题求助

问题解决:在Tkinter中更新Matplotlib图表而非重复新建

问题原因

你的代码每次调用graph()函数时,都会重新创建完整的Figure、Canvas和Toolbar组件,再通过pack()添加到窗口里,所以每次点击按钮都会新增一个图表,而非更新原有内容。

解决方案

把图表核心对象(Figure、Axes、Canvas、Toolbar)提前初始化,仅在程序启动时创建一次;每次点击按钮时,只更新数据并刷新已有图表,不新建组件。

修改后的代码示例

import csv
import tkinter
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg, NavigationToolbar2Tk)

# 全局变量存储图表核心对象
fig = None
plot1 = None
canvas = None
toolbar = None
tkFenster = tkinter.Tk()
tkFenster.title("动态更新CSV数据图表")

def init_graph():
    """初始化图表组件,仅执行一次"""
    global fig, plot1, canvas, toolbar
    
    # 创建画布和坐标轴
    fig = Figure(figsize=(6,4), dpi=100)
    plot1 = fig.add_subplot(111)        
    # 绘制固定参考曲线
    liste_1_x = ["06:15", "15:30"]
    liste_1_y = [0,16000]
    plot1.plot(liste_1_x, liste_1_y, color="b", marker="o")
    plot1.grid()
    
    # 创建画布组件并添加到窗口
    canvas = FigureCanvasTkAgg(fig, master=tkFenster)
    canvas.draw()
    canvas_widget = canvas.get_tk_widget()
    canvas_widget.pack(side=tkinter.LEFT, expand=1)
    
    # 添加工具栏
    toolbar = NavigationToolbar2Tk(canvas, tkFenster)
    toolbar.update()

def update_graph():
    """更新图表数据,点击按钮时调用"""
    global plot1, canvas
    
    # 清空坐标轴,准备重新绘制
    plot1.clear()
    
    # 重新绘制固定参考曲线
    liste_1_x = ["06:15", "15:30"]
    liste_1_y = [0,16000]
    plot1.plot(liste_1_x, liste_1_y, color="b", marker="o")
    
    # 读取最新CSV数据
    list_2_x = []
    list_2_y = []
    with open("testdata.csv", "r") as filedata:
        lines = csv.reader(filedata, delimiter=",")
        for row in lines:
            list_2_x.append(row[0])
            list_2_y.append(int(row[1]))
    
    # 绘制更新后的动态曲线
    plot1.plot(list_2_x, list_2_y, color="r", marker="o")
    plot1.grid()
    
    # 刷新画布,更新显示
    canvas.draw()

# 初始化图表
init_graph()

# 添加更新按钮
update_btn = tkinter.Button(tkFenster, text="加载最新数据", command=update_graph)
update_btn.pack(side=tkinter.TOP)

tkFenster.mainloop()

关键修改点

  1. 将import语句移到函数外部,避免重复导入消耗资源
  2. 拆分出init_graph()函数,仅在程序启动时创建一次图表组件
  3. update_graph()函数负责:
    • 清空原有坐标轴内容
    • 读取最新CSV数据
    • 重新绘制曲线
    • 调用canvas.draw()刷新已有画布,而非新建组件
  4. 按钮绑定update_graph(),替代原有新建图表的逻辑

额外优化建议

  • 如果CSV数据量较大,可以记录上次读取的行数,仅读取新增内容,提升更新效率
  • 若需要保留历史曲线(不清空原有曲线),可去掉plot1.clear(),直接追加新曲线,但要注意避免重复绘制

内容的提问来源于stack exchange,提问作者red

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:15:40