Reputation: 77
I am trying to get tkinter check button implemented with matplotlib in order to update the plot and show the selected plots only.
However, the check button wouldn't change the variable.
I've tried different versions of python and stripping down most of my code to just simple tkinter and matplotlib integration, without any luck.
# coding: utf-8
# usr/bin/python37
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from tkinter import messagebox, Button, Tk, BooleanVar
from tkinter.ttk import Checkbutton
import matplotlib.pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
class GUI:
fig = plt.figure()
sub = fig.add_subplot(1, 1, 1)
def __init__(self, root):
self.root = root
self.root.title("Testing")
self.setupTk()
def setupTk(self):
self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1)
self.canvas._tkcanvas.pack(side='top', fill='both', expand=1)
'''
Problem
'''
self.var = BooleanVar()
self.var.set(True)
self.button = Checkbutton(
self.root, variable=self.var, text='Direvative', command=self.cb)
self.button.pack(side='left')
'''
/Problem
'''
self.button = Button(master=self.root, text='Quit', command=self._quit)
self.button.pack(side='right')
self.toolbar = NavigationToolbar2Tk(self.canvas, self.root)
self.toolbar.update()
self.root.protocol("WM_DELETE_WINDOW", self._quit)
def cb(self):
print(self.var.get())
def _quit(self):
if messagebox.askquestion('Exit Application', 'Are you sure you want to exit the application', icon='warning') == 'yes':
self.root.quit()
self.root.destroy()
if __name__ == '__main__':
root = Tk()
mod = GUI(root)
root.mainloop()
I am using:
Python: 3.7.3
Matplotlib: 3.1.1
I expect the printout to change as the user clicks the check button.
Please feel free to point me towards resources online.
Upvotes: 1
Views: 743
Reputation: 36662
You need to use matplotlib.Figure
instead of pyplot.figure
.
You also had two buttons with the same name, but that was not the problem.
The following code embeds a matplotlib.Figure
, with a subplot
and a toolbar
, in a tkinter.window
that has a check_button
, and a quit_button
. I removed the messagebox
that I found irritating, but you can put it back, there was nothing wrong with the code.
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
from tkinter import messagebox, Button, Tk, BooleanVar
from tkinter.ttk import Checkbutton
from matplotlib.figure import Figure
import matplotlib
matplotlib.use('TkAgg')
class GUI:
fig = Figure()
sub = fig.add_subplot(1, 1, 1)
def __init__(self, root):
self.root = root
self.root.title("Testing")
self.setupTk()
def setupTk(self):
self.var = BooleanVar()
self.var.set(True)
self.check_button = Checkbutton(
self.root, variable=self.var, text='Direvative', command=self.cb)
self.check_button.pack(side='left')
self.quit_button = Button(master=self.root, text='Quit', command=self._quit)
self.quit_button.pack(side='right')
self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1)
self.canvas._tkcanvas.pack(side='top', fill='both', expand=1)
self.toolbar = NavigationToolbar2Tk(self.canvas, self.root)
self.toolbar.update()
self.root.protocol("WM_DELETE_WINDOW", self._quit)
def cb(self):
print(self.var.get())
def _quit(self):
self.root.destroy()
if __name__ == '__main__':
root = Tk()
mod = GUI(root)
root.mainloop()
Upvotes: 2