matplotlib弹出窗口中发生错误(AttributeError:“ NoneType”对象没有属性“ set_canvas”)

发布于 2021-01-29 15:03:25

我试图在弹出窗口中绘制图形。它弹出。但是有一个错误。

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


label_1 = tk.Label(window, text="Conpyright 123456789123456798", anchor=tk.S)
label_1.pack()

ws = window.winfo_screenwidth()
hs = window.winfo_screenheight()
w = 980  # width for the Tk root
h = 600  # height for the Tk root
x = (ws / 2) - (w / 2)
y = (hs / 2) - (h / 2)



window.geometry('%dx%d+%d+%d' % (w, h, x, y))
canvas = tk.Canvas(window, bg="white", width=980, height=580, highlightthickness=0)
canvas.pack()
canvas_scroll = tk.Scrollbar(canvas, command=canvas.yview)
canvas_scroll.place(relx=1, rely=0, relheight=1, anchor=tk.NE)
canvas.configure(yscrollcommand=canvas_scroll.set, scrollregion=())



minw_var = tk.DoubleVar()
entry_minw_number = tk.Entry(canvas, textvariable=minw_var)
canvas.create_window(220,215, window=entry_minw_number)

maxw_var = tk.DoubleVar()
entry_maxw_number = tk.Entry(canvas, textvariable=maxw_var)
canvas.create_window(355,215, window=entry_maxw_number)


minl_var = tk.DoubleVar()
entry_minl_number = tk.Entry(canvas, textvariable=minl_var)
canvas.create_window(220,240, window=entry_minl_number)

maxl_var = tk.DoubleVar()
entry_maxl_number = tk.Entry(canvas, textvariable=maxl_var)
canvas.create_window(355,240, window=entry_maxl_number)

rect_var = tk.IntVar()
entry_rect_number = tk.Entry(canvas, textvariable=rect_var)
canvas.create_window(290,270, window=entry_rect_number)

这是matplotlib的一部分

-------------------------------------------------- -----------------------

def plot_sheet(self):
    fig,ax = plt.subplots(1)
    ax.set_xlim([0, self.W]) 
    ax.set_ylim([0, self.L]) 
    recs = []
    for i in range(len(self.rect_list)):
        if self.rect_rotate[i]:
            ax.add_patch(patches.Rectangle((self.rect_pos[i][0], self.rect_pos[i][1]), self.rect_list[i].l, self.rect_list[i].w,linewidth=3,edgecolor='r'))
        else:
            ax.add_patch(patches.Rectangle((self.rect_pos[i][0], self.rect_pos[i][1]), self.rect_list[i].w, self.rect_list[i].l,linewidth=3,edgecolor='r'))
    #plt.show()
    return fig
def plot_sheets(self):
    for i in range(len(self.sheets)):
        self.sheets[i].plot_sheet()

def cal_culate1():

    fig = packing_options[best_index].plot_sheets()

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

window.mainloop()

我写了dataPlot = FigureCanvasTkAgg(fig,master = window)。master = window中存在错误。

在cal_culate1数据中的文件“”,第687行,数据图= FigureCanvasTkAgg(fig,master = window)

初始化 超级文件(FigureCanvasTk,self)中的文件“ C:\ Users \ sel \ Anaconda3 \ lib \
site-packages \ matplotlib \ backends_backend_tk.py”,第204行。 初始化 (图)

初始化 图中的文件“ C:\ Users \ sel \ Anaconda3 \ lib \ site-packages \
matplotlib \ backend_bases.py”,行1618。set_canvas(self)

AttributeError:“ NoneType”对象没有属性“ set_canvas”

那里应该写什么?

关注者
0
被浏览
150
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我做了一个最小的工作示例,说明了如何做到这一点。

    它需要对您的代码进行更改,但我不知道您在代码中所拥有的内容,并且您也没有创建最少的工作示例。

    在此处输入图片说明

    它使用(without
    )在generate_all_figures(在您的代码中将plot_sheets使用s)中创建三个数字,并保持在列表中。plot_sheet``s

    window 显示此列表中的第一个图形。

    Buttons 删除带有图形的画布,并从列表中使用下一个/上一个图形创建新的画布。

    我使用grid()而不是pack()因为这样可以轻松地将新画布放在同一位置。

    import tkinter as tk
    import matplotlib.pyplot as plt
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
    
    class MyClass():
    
        def __init__(self):
    
            self.sheets = [[1,2,3], [3,1,2], [1,5,1]]
            self.W = 2
            self.L = 5
            self.all_figures = []
    
        def plot_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
    
        def generate_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)
    
    def show_figure(number):
        global dataPlot
    
        # remove old canvas
        if dataPlot is not None: # 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)
    
    def on_prev():
        global selected_figure
    
        # get number of previous figure
        selected_figure -= 1
        if selected_figure < 0:
            selected_figure = len(my_class.all_figures)-1
    
        show_figure(selected_figure)
    
    def on_next():
        global selected_figure
    
        # get number of next figure
        selected_figure += 1
        if 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()
    

    可能无需替换画布即可完成,但可以替换剧情中的数据(fig.data???,ax.data???我不记得了)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看