在Tkinter上,当我在画布上绘制新图形时,是否有任何方法可以将前一个图形销毁而不放在右边?

时间:2020-11-12 22:12:12

标签: python tkinter

当我在画布上绘制新图形时,有没有办法将前一个图形破坏并且不堆叠在右侧?我尝试了一些诸如使用.destroy()的操作,但是似乎没有任何效果...每当我按 draw 按钮时,它都会一直在右边显示新图形。我不知道如何解决它,所以真的很欢迎它。

这是按下按钮时发生的情况的图片:右侧添加了另一个图形。我只想要一个(按下按钮时得到的最后一个)。

enter image description here

enter image description here

这是我的代码:

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 个答案:

答案 0 :(得分:0)

您可以在fig外部创建canvasfunc1()并更新其中的图形:

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)