我是Python的新手。我希望plt.close('all')
会在单击名为 CHANGE DATA 的按钮时删除旧图形。而是将新图放置在旧图旁边(左侧)。额外的点击会显示更多图表,但是旧的图表永远不会被删除。
我做错了吗?或者这是一起使用 tkinter 和 matplotlib 的限制吗?
import tkinter as tk
from tkinter import Button
import numpy as np
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
matplotlib.use('TkAgg')
def displ_graf(datalst):
ff = plt.figure(figsize=(5.6,4), dpi=100)
xx = ff.add_subplot(1,1,1)
nn = np.arange(len(datalst))
bb = xx.barh(nn, datalst, 0.8)
ff.tight_layout
cc = FigureCanvasTkAgg(ff, master=ww)
cc.draw()
cc.get_tk_widget().pack(side=tk.RIGHT)
def graf2():
plt.close('all')
data2 = [64, 58, 12, 91, 49, 32, 70, 23, 35]
displ_graf(data2)
ww = tk.Tk()
ww.geometry('700x400')
ww.state('zoomed')
butt3 = Button(ww,text=' CHANGE DATA ',command=graf2, height=1,width=15)
butt3.place(x=790, y=100)
data1 = [31, 41, 59, 26, 53, 58, 97, 93, 23]
displ_graf(data1)
ww.mainloop()
单击按钮之前,左侧图像显示初始屏幕,单击按钮上之后,右侧图像显示屏幕:
答案 0 :(得分:1)
您可以使用cc.get_tk_widget().destroy()
来做到这一点。但是您的代码似乎有点笨拙。所以也许看看这个example
仅举一个可行的例子:
import tkinter as tk
from tkinter import Button
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
def displ_graf(datalst):
ff = plt.figure(figsize=(5.6,4), dpi=100)
xx = ff.add_subplot(1,1,1)
nn = np.arange(len(datalst))
bb = xx.barh(nn, datalst, 0.8)
ff.tight_layout
cc = FigureCanvasTkAgg(ff, master=ww)
cc.draw()
cc.get_tk_widget().pack(side=tk.RIGHT)
return cc
def graf2():
data2 = [64, 58, 12, 91, 49, 32, 70, 23, 35]
displ_graf(data2)
def destroy():
canv.get_tk_widget().destroy()
ww = tk.Tk()
ww.geometry('700x400')
ww.state('normal')
butt3 = Button(ww,text=' CHANGE DATA ',command=graf2, height=1,width=15)
butt4 = Button(ww,text=' destroy ',command=destroy, height=1,width=15)
butt3.place(x=790, y=100)
butt4.place(x=500, y=100)
data1 = [31, 41, 59, 26, 53, 58, 97, 93, 23]
canv = displ_graf(data1)
ww.mainloop()
但是这里的问题是每次您运行displ_graph