График не очищается, вместо этого он добавляется ниже существующего графика в tkinter - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в tkinter и не могу очистить график после того, как нарисовал код, указанный ниже. Моя цель - очистить холст после нажатия кнопки «Назад», чтобы в следующий раз я смог нарисовать новый график на том же кадре. Я получаю свои данные из файла CSV для представления на графике с помощью matplotlib

import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import pandas as pd
from matplotlib.figure import Figure
import seaborn as sns
import tkinter as tk
from tkinter import ttk, filedialog
import csvedit as cv


LARGE_FONT= ("Verdana", 12)


class SeaofBTCapp(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)
        tk.Tk.iconbitmap(self, default="q1.ico")
        tk.Tk.wm_title(self, "Diabetic Predictor")
        tk.Tk.geometry(self,'600x600')        

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand = True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (StartPage, PageOne, PageTwo, PageThree):

            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame(StartPage)

    def show_frame(self, cont):

        frame = self.frames[cont]
        frame.tkraise()                    


class StartPage(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        label = tk.Label(self, text="Start Page", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button = ttk.Button(self, text="Visit Page 1",command=lambda: controller.show_frame(PageOne))
        button.pack()
        button2 = ttk.Button(self, text="Visit Page 2",command=lambda: controller.show_frame(PageTwo))
        button2.pack()
        button3 = ttk.Button(self, text="Graph Page",command=lambda: controller.show_frame(PageThree))
        button3.pack()
class PageThree(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Graph Page!", font=LARGE_FONT)
        label.pack(pady=10,padx=10)
        button1 = ttk.Button(self, text="Back to Home",command=lambda: controller.show_frame(StartPage))
        button1.pack()        
        button4 = ttk.Button(self, text = "Dsiplay graph", command=self.fileDialog1)        
        button4.pack()


    def fileDialog1(self):

        self.filename = filedialog.askopenfilename(initialdir =  "/", title = "Select A File", filetype =(("csv files","*.csv"),("all files","*.*")) )
        text = self.filename
        dataset = pd.read_csv(text)        
        f = Figure(figsize=(5,5), dpi=100)
        a = f.add_subplot(111)
        sns.countplot(dataset['result'],ax=a)
        canvas = FigureCanvasTkAgg(f, self)
        canvas.draw()
        canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
        toolbar = NavigationToolbar2Tk(canvas, self)
        toolbar.update()
        canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

Я попытался создать пустой конструктор в конструкторе, чтобы предыдущие данные были понятны, но это не помогло, поэтому пожалуйста, предложите правильный способ достижения этого.

1 Ответ

0 голосов
/ 10 апреля 2020

Я решил вышеупомянутую проблему с помощью canvas.get_tk_widget (). Pack_forget ():

def clearPlotPage(self):

    self.canvas.get_tk_widget().pack_forget()
    self.canvas = None
    print("Plot Page has been cleared")

для получения более подробной информации см .: Ссылка

...