matplotlib 弹出窗口中的错误

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


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 的一部分

我写了 dataPlot = FigureCanvasTkAgg(fig, master = window)。master = 窗口有错误。


文件“”,第 687 行,在 cal_culate1 dataPlot = FigureCanvasTkAgg(fig, master = window)


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


文件“C:\Users\sel\Anaconda3\lib\site-packages\matplotlib\backend_bases.py”,第 1618 行,在init figure.set_canvas(self)


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


那里应该写什么?


POPMUISE
浏览 322回答 2
2回答

隔江千里

我做了最小的工作示例,展示了如何做到这一点。它需要更改您的代码,但我不知道您在代码中有什么,并且您没有创建最小的工作示例。它使用(不带)在generate_all_figures(在您的代码中将plot_sheets带有s)创建三个数字并保留在列表中。plot_sheetswindow 显示此列表中的第一个数字。Buttons 删除带有图形的画布并使用列表中的下一个/上一个图形创建新的画布。我使用grid()代替,pack()因为这样我可以轻松地将新画布放在同一个地方。import tkinter as tkimport matplotlib.pyplot as pltfrom matplotlib.backends.backend_tkagg import FigureCanvasTkAggclass MyClass():&nbsp; &nbsp; def __init__(self):&nbsp; &nbsp; &nbsp; &nbsp; self.sheets = [[1,2,3], [3,1,2], [1,5,1]]&nbsp; &nbsp; &nbsp; &nbsp; self.W = 2&nbsp; &nbsp; &nbsp; &nbsp; self.L = 5&nbsp; &nbsp; &nbsp; &nbsp; self.all_figures = []&nbsp; &nbsp; def plot_sheet(self, data):&nbsp; &nbsp; &nbsp; &nbsp; """plot single figure"""&nbsp; &nbsp; &nbsp; &nbsp; fig, ax = plt.subplots(1)&nbsp; &nbsp; &nbsp; &nbsp; ax.set_xlim([0, self.W])&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ax.set_ylim([0, self.L])&nbsp; &nbsp; &nbsp; &nbsp; ax.plot(data)&nbsp; &nbsp; &nbsp; &nbsp; return fig&nbsp; &nbsp; def generate_all_figures(self):&nbsp; &nbsp; &nbsp; &nbsp; """create all figures and keep them on list"""&nbsp; &nbsp; &nbsp; &nbsp; for data in self.sheets:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fig = self.plot_sheet(data)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.all_figures.append(fig)def show_figure(number):&nbsp; &nbsp; global dataPlot&nbsp; &nbsp; # remove old canvas&nbsp; &nbsp; if dataPlot is not None: # at start there is no canvas to destroy&nbsp; &nbsp; &nbsp; &nbsp; dataPlot.get_tk_widget().destroy()&nbsp; &nbsp; # get figure from list&nbsp; &nbsp; one_figure = my_class.all_figures[number]&nbsp; &nbsp; # display canvas with figuere&nbsp; &nbsp; dataPlot = FigureCanvasTkAgg(one_figure, master=window)&nbsp; &nbsp; dataPlot.draw()&nbsp; &nbsp; dataPlot.get_tk_widget().grid(row=0, column=0)def on_prev():&nbsp; &nbsp; global selected_figure&nbsp; &nbsp; # get number of previous figure&nbsp; &nbsp; selected_figure -= 1&nbsp; &nbsp; if selected_figure < 0:&nbsp; &nbsp; &nbsp; &nbsp; selected_figure = len(my_class.all_figures)-1&nbsp; &nbsp; show_figure(selected_figure)def on_next():&nbsp; &nbsp; global selected_figure&nbsp; &nbsp; # get number of next figure&nbsp; &nbsp; selected_figure += 1&nbsp; &nbsp; if selected_figure > len(my_class.all_figures)-1:&nbsp; &nbsp; &nbsp; &nbsp; selected_figure = 0&nbsp; &nbsp; show_figure(selected_figure)# --- main ---my_class = MyClass()my_class.generate_all_figures()window = tk.Tk()window.rowconfigure(0, minsize=500)&nbsp; &nbsp; # minimal heightwindow.columnconfigure(0, minsize=700) # minimal width# display first figure&nbsp; &nbsp;&nbsp;selected_figure = 0dataPlot = None # default value for `show_figure`show_figure(selected_figure)# add buttons to change figuresframe = 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???我不记得)

芜湖不芜

你没有展示你如何创建你的绘图类,所以我只能在这里假设。首先创建一个空列表:import tkinter as tkwindow = tk.Tk()window.configure(background='white')figure_holder = []然后在创建时附加到列表中figure:def plot_sheets(self):&nbsp; &nbsp; for i in range(len(self.sheets)):&nbsp; &nbsp; &nbsp; &nbsp; a = self.sheets[i].plot_sheet()&nbsp; &nbsp; &nbsp; &nbsp; figure_holder.append(a)figure绘制对象时从列表中检索对象:def cal_culate1():&nbsp; &nbsp; fig = figure_holder[0]&nbsp; &nbsp; dataPlot = FigureCanvasTkAgg(fig, master = window)&nbsp; &nbsp; #dataPlot.show()&nbsp; &nbsp; dataPlot.get_tk_widget().pack(side='top', fill='both', expand=1)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python