使用 tkinter——如果存在或类似,如何清除 FigureCanvasTkAgg 对象?
Using tkinter -- How to clear FigureCanvasTkAgg object if exists or similar?
尝试创建一个基于 window 的 tkinter,它允许用户在单击按钮时创建图表,刷新图表——而不是每次都添加另一个。所有这些都无需创建新的 window。这个想法是单击 -> 创建图表,再次单击 -> 在同一位置用新图表替换图表。没有额外的点击,没有额外的关闭按钮。使用 matplotlib.backends.backend_tkagg 和 FigureCanvasTkAgg。这方面的文档似乎几乎不存在。尝试了 .get_tk_widget() 中的各种属性,看看我是否可以测试它是否已经存在,获取列表等。还尝试清除 canvas.
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
class testme:
def __init__(self,frame1):
self.frame1=frame1
self.button=Button(self.frame1,text="DRAWME",command=self.plot)
self.button1=Button(self.frame1,text="CLEARME",command=self.clearme)
self.button.pack()
self.button1.pack()
def plot(self):
f=Figure(figsize=(5,1))
aplt=f.add_subplot(111)
aplt.plot([1,2,3,4])
self.wierdobject = FigureCanvasTkAgg(f, master=self.frame1)
self.wierdobject.get_tk_widget().pack()
self.wierdobject.draw()
def clearme(self):
self.wierdobject.get_tk_widget().pack_forget()
root=Tk()
aframe=Frame(root)
testme(aframe)
aframe.pack() #packs a frame which given testme packs frame 1 in testme
root.mainloop()
附加的示例代码几乎接近我的目标,但它需要一个 "CLEARME" 按钮(只有在 "DRAWME" 只被点击一次时才能正常工作。我只想要某种 if 语句来检查是否有已经是框架中的 FigureCanvasTkAgg 对象,如果是,请将其删除而不是单击按钮。
经过多次尝试后,我得出结论,我对这里发生的不止一件事存在根本性的误解。
对于您当前的设置,只需在 plot
函数的开头添加一个 try 子句。
def plot(self):
try:
self.wierdobject.get_tk_widget().pack_forget()
except AttributeError:
pass
f=Figure(figsize=(5,1))
aplt=f.add_subplot(111)
aplt.plot([1,2,3,4])
self.wierdobject = FigureCanvasTkAgg(f, master=self.frame1)
self.wierdobject.get_tk_widget().pack()
self.wierdobject.draw()
尝试创建一个基于 window 的 tkinter,它允许用户在单击按钮时创建图表,刷新图表——而不是每次都添加另一个。所有这些都无需创建新的 window。这个想法是单击 -> 创建图表,再次单击 -> 在同一位置用新图表替换图表。没有额外的点击,没有额外的关闭按钮。使用 matplotlib.backends.backend_tkagg 和 FigureCanvasTkAgg。这方面的文档似乎几乎不存在。尝试了 .get_tk_widget() 中的各种属性,看看我是否可以测试它是否已经存在,获取列表等。还尝试清除 canvas.
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from tkinter import *
class testme:
def __init__(self,frame1):
self.frame1=frame1
self.button=Button(self.frame1,text="DRAWME",command=self.plot)
self.button1=Button(self.frame1,text="CLEARME",command=self.clearme)
self.button.pack()
self.button1.pack()
def plot(self):
f=Figure(figsize=(5,1))
aplt=f.add_subplot(111)
aplt.plot([1,2,3,4])
self.wierdobject = FigureCanvasTkAgg(f, master=self.frame1)
self.wierdobject.get_tk_widget().pack()
self.wierdobject.draw()
def clearme(self):
self.wierdobject.get_tk_widget().pack_forget()
root=Tk()
aframe=Frame(root)
testme(aframe)
aframe.pack() #packs a frame which given testme packs frame 1 in testme
root.mainloop()
附加的示例代码几乎接近我的目标,但它需要一个 "CLEARME" 按钮(只有在 "DRAWME" 只被点击一次时才能正常工作。我只想要某种 if 语句来检查是否有已经是框架中的 FigureCanvasTkAgg 对象,如果是,请将其删除而不是单击按钮。
经过多次尝试后,我得出结论,我对这里发生的不止一件事存在根本性的误解。
对于您当前的设置,只需在 plot
函数的开头添加一个 try 子句。
def plot(self):
try:
self.wierdobject.get_tk_widget().pack_forget()
except AttributeError:
pass
f=Figure(figsize=(5,1))
aplt=f.add_subplot(111)
aplt.plot([1,2,3,4])
self.wierdobject = FigureCanvasTkAgg(f, master=self.frame1)
self.wierdobject.get_tk_widget().pack()
self.wierdobject.draw()