Reputation: 161
I am using tkinter in python. I would like to be able to plot data as I click on the button compute. and also I would like also to take into account the values given in the entries. Up to now my script run normally, but nothing happen when I click compute of change the entry values. here is the code :
#------- start
from tkinter import *
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np
class MyWindow:
def __init__(self, win):
x0, xt0, y0 = 10, 100, 50
#---- First label and entry -------
self.lbl0 = Label(win, text='Initial instant')
self.lbl0.config(font=('Arial', 9))
self.lbl0.place(x=x0, y=y0)
self.t0 = Entry()
self.t0.place(x=xt0, y=y0)
self.t0.insert(END, str(0))
self.t_0 = float(self.t0.get())
#---- Second label and entry -------
self.lbl1 = Label(win, text='Final instant')
self.lbl1.config(font=('Arial', 10))
self.lbl1.place(x=x0, y=y0 + 40)
self.t1 = Entry()
self.t1.place(x=xt0, y=y0 + 40)
self.t1.insert(END, str(1))
self.t_1 = float(self.t1.get())
#---- Compute button -------
self.btn = Button(win, text='Compute')
self.btn.bind('<Button-1>', self.plot)
self.btn.place(x=xt0, y=y0 + 80)
self.figure = Figure(figsize=(4.5, 3), dpi=100)
#---- subplot 1 -------
self.subplot1 = self.figure.add_subplot(211)
self.subplot1.set_xlim(self.t_0, self.t_1)
#---- subplot 2 -------
self.subplot2 = self.figure.add_subplot(212)
self.subplot2.set_xlabel('$Time(s)$', fontsize=11)
self.subplot2.set_xlim(self.t_0, self.t_1)
#---- Show the plot-------
self.plots = FigureCanvasTkAgg(self.figure, win)
self.plots.get_tk_widget().pack(side=RIGHT, fill=BOTH, expand=0)
def data(self):
self.t_0 = float(self.t0.get())
self.t_1 = float(self.t1.get())
t = np.linspace(self.t_0, self.t_1, 100)
func1 = t**0.5
func2 = t**2.
return t, func1, func2
def plot(self, event):
t, func1, func2 = self.data()
self.t_0 = float(self.t0.get())
self.t_1 = float(self.t1.get())
self.subplot1.set_xlim(self.t_0, self.t_1)
self.subplot1.plot(t, func1, 'r', lw=2.5)
self.subplot2.set_xlim(self.t_0, self.t_1)
self.subplot2.plot(t, func2, 'b', lw=2.5)
window = Tk()
mywin = MyWindow(window)
window.title('My model')
window.geometry("800x600+10+10")
window.mainloop()
Upvotes: 3
Views: 3404
Reputation: 71
In order to clear the plots before adding a new one, you can use :
your_fig.clf()
(clears the figure)
or
your_fig.cla()
(clears the axis).
or
ax.clear()
:)
Upvotes: 1
Reputation: 1291
You were missing a small detail in your MyWindow.plot()
method, and it is to actually draw your plots. If you modify it like this (note the additional line in the function):
def plot(self, event):
t, func1, func2 = self.data()
self.t_0 = float(self.t0.get())
self.t_1 = float(self.t1.get())
self.subplot1.set_xlim(self.t_0, self.t_1)
self.subplot1.plot(t, func1, 'r', lw=2.5)
self.subplot2.set_xlim(self.t_0, self.t_1)
self.subplot2.plot(t, func2, 'b', lw=2.5)
self.plots.draw()
Then you get the expected behavior (for the default case in this example):
Upvotes: 2