如何在 tkinter 中更新由 matplotlib 创建的图形
How to update a graph created by matplotlib in tkinter
我有一个使用 tkinter 创建的应用程序。只有一个 window,我在其中输入 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 中看到旧图表。
要重复使用绘图区,您需要:
- 清除当前数字
- 向图中添加新数据
- 重新绘制canvas
下面是它如何处理您的代码的一些更改:
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()
self.canvas.get_tk_widget().pack_forget()
我有一个使用 tkinter 创建的应用程序。只有一个 window,我在其中输入 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 中看到旧图表。
要重复使用绘图区,您需要:
- 清除当前数字
- 向图中添加新数据
- 重新绘制canvas
下面是它如何处理您的代码的一些更改:
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()
self.canvas.get_tk_widget().pack_forget()