Есть ли в Tkinter какой-либо способ, чтобы при построении нового графика на холсте предыдущий уничтожался и не укладывался справа?

#python #tkinter

#python #tkinter

Вопрос:

Есть ли какой-либо способ, чтобы при построении нового графика на холсте предыдущий уничтожался и не укладывался справа? Я пробовал некоторые вещи, такие как использование a .destroy() , но, похоже, ничего не работает… Он продолжает помещать новый график вправо каждый раз, когда я нажимаю drawкнопку. Я понятия не имею, как это решить, поэтому любая помощь действительно приветствуется.

Вот изображение того, что происходит, когда я нажимаю кнопку: справа добавляется еще один график. Мне просто нужен только один (последний, который я получаю при нажатии кнопки).

введите описание изображения здесь

введите описание изображения здесь

Вот мой код:

 class StartPage(tk.Frame):
    
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        button2 = ttk.Button(self, text="draw",command=lambda:  func1())
        button2.pack()
        entry1 = Entry(self,width = 20)
        entry1.pack()
        entry2 = Entry(self,width = 20)
        entry2.pack()
        entry3 = Entry(self,width = 20)
        entry3.pack()

        def func1():
            rho = float(entry1.get())
            sigma = float(entry2.get())
            beta = float(entry3.get())
            def f(state, t):
                x, y, z = state  
                return sigma * y, z-sigma, rho*x * y - beta * z  

            state0 = [4.0, 3.0, 2.0]
            t = np.arange(0.0, 40.0, 0.01)

            states = odeint(f, state0, t)

            fig = plt.figure()
            canvas = FigureCanvasTkAgg(fig, self)
            canvas.draw() 
            ax = fig.gca(projection='3d')
            ax.plot(states[:, 0], states[:, 1], states[:, 2])
            canvas.get_tk_widget().pack(side=tk.LEFT,fill=tk.BOTH, expand=True)
  

Комментарии:

1. Я думаю, вы не можете уничтожить canvas, потому что вы используете canvas в качестве локальной переменной функции func1 . Попробуйте снова использовать self.canvas вместо этого. Если это не сработает, скажите мне, и я лучше посмотрю на это

Ответ №1:

Вы можете создать fig и canvas снаружи func1() и обновить фигуру внутри нее:

 class StartPage(tk.Frame):
    
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        button2 = ttk.Button(self, text="draw",command=lambda: func1())
        button2.pack()
        entry1 = tk.Entry(self, width=20)
        entry1.pack()
        entry2 = tk.Entry(self, width=20)
        entry2.pack()
        entry3 = tk.Entry(self, width=20)
        entry3.pack()

        fig = plt.figure()
        canvas = FigureCanvasTkAgg(fig, self)

        def func1():
            rho = float(entry1.get())
            sigma = float(entry2.get())
            beta = float(entry3.get())
            def f(state, t):
                x, y, z = state  
                return sigma * y, z-sigma, rho*x * y - beta * z  

            state0 = [4.0, 3.0, 2.0]
            t = np.arange(0.0, 40.0, 0.01)

            states = odeint(f, state0, t)

            plt.clf()  # clear current figure
            ax = fig.gca(projection='3d')
            ax.plot(states[:, 0], states[:, 1], states[:, 2])
            canvas.draw() # update the figure
            canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)