I’m making a GUI application and I want to use matplotlib to display some plots. I have structured my code like that:
JavaScript
x
33
33
1
import tkinter as tk
2
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
3
import matplotlib.pyplot as plt
4
5
6
class PopUP_Graph(tk.Toplevel):
7
def __init__(self, *args, **kargs):
8
super().__init__(*args, **kargs)
9
self.fig, self.ax = plt.subplots()
10
self.drawing_area = FigureCanvasTkAgg(self.fig, master=self)
11
self.drawing_area.draw()
12
self.toolbar = NavigationToolbar2Tk(self.drawing_area, self)
13
self.toolbar.update()
14
self.drawing_area.get_tk_widget().pack(side="top", fill="both", expand=1)
15
16
17
class App:
18
def __init__(self, root):
19
self.master = root
20
self.button = tk.Button(root, text="Open graph", command=self.open_graph)
21
self.button.grid(column=0, row=0)
22
23
def open_graph(self):
24
popupgraph1 = PopUP_Graph(self.master)
25
popupgraph1.mainloop()
26
27
28
w, h = 900, 600
29
root = tk.Tk()
30
root.geometry(f'{w}x{h}+0+0')
31
app = App(root)
32
root.mainloop()
33
The problem I have is that when the toplevel window is displayed and then closed, the program won’t close correctly even after closing the root window.
Is there a way to fix this??
Advertisement
Answer
As Henry Yik pointed out matplotlib.figure.Figure
should be used instead of pyplot
. Now it works:
JavaScript
1
35
35
1
import tkinter as tk
2
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
3
from matplotlib.figure import Figure
4
5
6
class PopUP_Graph(tk.Toplevel):
7
def __init__(self, *args, **kargs):
8
super().__init__(*args, **kargs)
9
# self.fig, self.ax = plt.subplots()
10
self.fig = Figure()
11
self.ax = self.fig.add_subplot()
12
self.drawing_area = FigureCanvasTkAgg(self.fig, master=self)
13
self.drawing_area.draw()
14
self.toolbar = NavigationToolbar2Tk(self.drawing_area, self)
15
self.toolbar.update()
16
self.drawing_area.get_tk_widget().pack(side="top", fill="both", expand=1)
17
18
19
class App:
20
def __init__(self, root):
21
self.master = root
22
self.button = tk.Button(root, text="Open graph", command=self.open_graph)
23
self.button.grid(column=0, row=0)
24
25
def open_graph(self):
26
popupgraph1 = PopUP_Graph(self.master)
27
popupgraph1.mainloop()
28
29
30
w, h = 900, 600
31
root = tk.Tk()
32
root.geometry(f'{w}x{h}+0+0')
33
app = App(root)
34
root.mainloop()
35