Использование tkinter - Как очистить объект FigureCanvasTkAgg, если он существует или похож? - PullRequest
0 голосов
/ 15 мая 2019

Попытка создать окно на основе tkinter, которое позволяет пользователю создавать диаграмму по нажатию кнопки, обновляя диаграмму - не добавляя другую, каждый раз.Все без создания нового окна.Идея состоит в том, чтобы щелкнуть -> создать диаграмму, нажать еще раз -> заменить диаграмму новой диаграммой в том же месте.Никаких лишних кликов, никаких лишних кнопок для закрытия.Использование matplotlib.backends.backend_tkagg и FigureCanvasTkAgg.По-видимому, документации по этому вопросу практически не существует.Попробовал различные атрибуты в .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 во фрейме, и если это так, удалите его вместо нажатия кнопки.

После нескольких попыток я пришел к выводу, что у меня есть фундаментальное недопонимание более чем одной вещи, которая здесь происходит.

1 Ответ

0 голосов
/ 16 мая 2019

Для текущей настройки просто добавьте предложение try в начале вашей функции plot.

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()    
...