Skip to content Skip to sidebar Skip to footer

Error In Matplotlib Popup Window (attributeerror: 'nonetype' Object Has No Attribute 'set_canvas')

I tried to plot the graph in pop up window. It pops up. But there is an error. import tkinter as tk window = tk.Tk() window.configure(background='white') label_1 = tk.Label(windo

Solution 1:

I made minimal working example which shows how do this.

it will need changes for your code but I don't know what you have in code and you didn't create minimal working example.

enter image description here

It creates three figures in generate_all_figures (in your code it will be plot_sheets with s) using plot_sheet (without s) and keep on list.

window display first figure from this list.

Buttons remove canvas with figure and create new canvas with next/previous figure from list.

I use grid() instead of pack() because this way I can easily put new canvas in the same place.

import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

classMyClass():

    def__init__(self):

        self.sheets = [[1,2,3], [3,1,2], [1,5,1]]
        self.W = 2
        self.L = 5
        self.all_figures = []

    defplot_sheet(self, data):
        """plot single figure"""

        fig, ax = plt.subplots(1)

        ax.set_xlim([0, self.W]) 
        ax.set_ylim([0, self.L])

        ax.plot(data)

        return fig

    defgenerate_all_figures(self):
        """create all figures and keep them on list"""for data in self.sheets:
            fig = self.plot_sheet(data)
            self.all_figures.append(fig)

defshow_figure(number):
    global dataPlot

    # remove old canvasif dataPlot isnotNone: # at start there is no canvas to destroy
        dataPlot.get_tk_widget().destroy()

    # get figure from list
    one_figure = my_class.all_figures[number]

    # display canvas with figuere
    dataPlot = FigureCanvasTkAgg(one_figure, master=window)
    dataPlot.draw()
    dataPlot.get_tk_widget().grid(row=0, column=0)

defon_prev():
    global selected_figure

    # get number of previous figure
    selected_figure -= 1if selected_figure < 0:
        selected_figure = len(my_class.all_figures)-1

    show_figure(selected_figure)

defon_next():
    global selected_figure

    # get number of next figure
    selected_figure += 1if selected_figure > len(my_class.all_figures)-1:
        selected_figure = 0

    show_figure(selected_figure)

# --- main ---

my_class = MyClass()
my_class.generate_all_figures()

window = tk.Tk()
window.rowconfigure(0, minsize=500)    # minimal height
window.columnconfigure(0, minsize=700) # minimal width# display first figure    
selected_figure = 0
dataPlot = None# default value for `show_figure`
show_figure(selected_figure)

# add buttons to change figures
frame = tk.Frame(window)
frame.grid(row=1, column=0)

b1 = tk.Button(frame, text="<<", command=on_prev)
b1.grid(row=0, column=0)

b2 = tk.Button(frame, text=">>", command=on_next)
b2.grid(row=0, column=1)

window.mainloop()

Probably it could be done without replacing canvas but by replacing data in plot (fig.data ???, ax.data ??? I don't remember)

Solution 2:

You didn't show how you create your class for plotting, so i can only go by assumption here. First create a empty list:

import tkinter as tk
window = tk.Tk()
window.configure(background='white')
figure_holder = []

Then append to the list when you create your figure:

defplot_sheets(self):
    for i inrange(len(self.sheets)):
        a = self.sheets[i].plot_sheet()
        figure_holder.append(a)

Retrieve the figure object from the list when you plot it:

def cal_culate1():

    fig = figure_holder[0]

    dataPlot = FigureCanvasTkAgg(fig, master = window)
    #dataPlot.show()
    dataPlot.get_tk_widget().pack(side='top', fill='both', expand=1)

Post a Comment for "Error In Matplotlib Popup Window (attributeerror: 'nonetype' Object Has No Attribute 'set_canvas')"