Abrian Abir
Abrian Abir

Reputation: 77

How to get tkinter integrated with matplotlib checkbutton to change the variable?

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

Answers (1)

Reblochon Masque
Reblochon Masque

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

Related Questions