使用tkinter如何清除FigureCanvasTkAgg对象(如果存在或类似对象)?

2024-10-03 21:31:02 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试创建一个基于tkinter的窗口,允许用户在单击按钮时创建图表,刷新图表,而不是每次都添加另一个。所有这些都不需要创建新窗口。方法是单击->创建图表,再单击->在同一位置用新图表替换图表。没有额外的点击,没有额外的按钮关闭。使用matplotlib.backends.backend_tkagg以及图中所示。关于这一点的文件似乎几乎不存在。尝试了.get_tk_widget()中的各种属性,以查看是否可以测试它是否已经存在,获取列表等。还尝试清除画布。在

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对象,如果是的话,删除它而不是单击按钮。在

经过多次尝试,我得出结论,我对这里发生的不止一件事有一个根本性的误解。在


Tags: fromimportselfgetmatplotlibdef图表widget
1条回答
网友
1楼 · 发布于 2024-10-03 21:31:02

对于当前的设置,只需在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()    

相关问题 更多 >