I've been trying to execute a command for a button to plot a matplotlib figure. I've been over this post. But it does not quite help since the example has everything in one class. I'm struggling to link the objects from different classes together.
The command to execute is for button2
in class EntryButton
. The plot itself is made in class CalcPlot
. And finally I want the plot to appear as an instance of the class PlotWindow
.
I've tried to set the command=PlotWindow.plot
, but that does not work. Also I'm not sure in which class the method should be in. The inheritance could work, but I don't find how to set it up since the classes already inherit from Frame
class.
from tkinter import *
import matplotlib
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
matplotlib.use('TkAgg')
class MainWindow(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.config(bg='blue')
self.pack(side=TOP, fill=BOTH, expand=True)
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
#frames
entry_frame = EntryButton(self)
plot_frame = PlotWindow(self)
x1 = 1
x2 = 2
y1 = 1
y2 = 2
class EntryButton(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.config(width=600, height=400, bg='#ff6600')
self.place(x=0, y=0)
self.entry1 = Entry(self, width=10)
self.entry1.insert(0, '0')
self.entry1.place(x=110, y=40, anchor=W)
self.entry2 = Entry(self, width=10)
self.entry2.insert(0, '0')
self.entry2.place(x=180, y=40, anchor=W)
self.entry3 = Entry(self, width=10)
self.entry3.insert(0, '0')
self.entry3.place(x=110, y=65, anchor=W)
self.entry4 = Entry(self, width=10)
self.entry4.insert(0, '0')
self.entry4.place(x=180, y=65, anchor=W)
label1 = Label(self, text='x coord.', font='arial 10 bold', bg='#ff6600')
label1.place(x=50, y=40, anchor=W)
label2 = Label(self, text='y coord.', font='arial 10 bold', bg='#ff6600')
label2.place(x=50, y=65, anchor=W)
button1 = Button(self, text='enter', width=8, command=self.set_values)
button1.place(x=180, y=100, anchor=W)
button2 = Button(self, text='plot', width=8, command=PlotWindow.plot)
button2.place(x=180, y=140, anchor=W)
def set_values(self):
global x1, x2, y1, y2
x1 = int(self.entry1.get())
x2 = int(self.entry2.get())
y1 = int(self.entry3.get())
y2 = int(self.entry4.get())
def plot(self): #possibly the function should be here
pass
class CalcClass:
def __init__(self, parent):
fig = Figure(figsize=(6, 4))
axes = fig.add_subplot(1, 1, 1)
global x1, x2, y1, y2
axes.plot([x1, x2], [y1, y2])
canvas = FigureCanvasTkAgg(fig, parent)
canvas.draw()
canvas.get_tk_widget().pack(side=TOP, fill=BOTH, expand=True)
class PlotWindow(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.config(width=600, height=400, bg='yellow')
self.place(x=600, y=0)
def plot(self):
plot = CalcClass(self)
if __name__ == '__main__':
root = Tk()
root.title('Frost Lite')
app = MainWindow(root)
root.geometry('1200x400+2000+800')
root.resizable(False, False)
root.mainloop()