#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)