如何在 tkinter 中更新由 matplotlib 创建的图形

Posted

技术标签:

【中文标题】如何在 tkinter 中更新由 matplotlib 创建的图形【英文标题】:How to update a graph created by matplotlib in tkinter 【发布时间】:2020-03-18 22:28:22 【问题描述】:

我有一个使用 tkinter 创建的应用程序。只有一个窗口,我在其中输入 X 和 Y。有了这些 x 和 y,我的应用程序应该使用 matplotlib 创建一个图形。

第一次正常工作,但其他人没有。我的意思是,我打开应用程序,输入 X 和 Y,单击按钮,应用程序创建图形,然后输入新的 X 和 Y,单击按钮,这不起作用,图形是相同的,不是新的。 我搜索了很多网站,但没有一个解决方案有效。

部分代码如下:

from tkinter import *
import matplotlib

import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure


window_width = 1000
window_height = 600
root = Tk()

global_fig = None


def create_draw(x_dots, y_dots):
    global global_fig
    if global_fig is not None:
        global_fig.clf()

    global_fig = Figure(figsize=(5, 4), dpi=100)

    global_fig.add_subplot(111).plot(x_dots, y_dots)

    canvas = FigureCanvasTkAgg(global_fig, master=root)  # A tk.DrawingArea.
    canvas.draw()
    canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)

    toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar.update()
    canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
    root.update()
    global_fig.canvas.draw()

root.mainloop()

问题的感觉是:

root.mainloop()
create_draw([3,4], [2,3])

输入后我看到一个图表,然后我输入

create_draw([-1, -2], [-3, -4])

我应该看到另一个图表,但我在 tkinter 中看到了旧图表。

【问题讨论】:

【参考方案1】:

要重复使用绘图区域,您需要:

    清除当前图形 向图中添加新数据 重绘画布

以下是它如何处理您的代码的一些更改:

from tkinter import *
import numpy as np

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from matplotlib.figure import Figure

window_width = 1000
window_height = 600

root = Tk()

fig = Figure(figsize=(5, 4), dpi=100)

canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1)
toolbar = NavigationToolbar2Tk(canvas, root)

def draw_chart():
    fig.clear()
    fig.add_subplot(111).plot(np.random.randint(1,10,5), np.random.randint(10,20,5)) #generate random x/y
    canvas.draw_idle()

Button(root,text="Draw",command=draw_chart).pack()

root.mainloop()

【讨论】:

以上是关于如何在 tkinter 中更新由 matplotlib 创建的图形的主要内容,如果未能解决你的问题,请参考以下文章

Python / Tkinter如何更新网格中的信息

单击后更新按钮的位置? (Tkinter Python GUI)

在 Windows,Python3.8 上使用多处理时如何更新 tkinter 应用程序中的状态

如何在清除现有图像后更新Tkinter中的新图像。

Python Tkinter:如何让画布每帧更新多边形坐标? [解决了]

如何更新 Tkinter 标签小部件的图像?