为了账号安全,请及时绑定邮箱和手机立即绑定

matplotlib 弹出窗口中的错误

matplotlib 弹出窗口中的错误

POPMUISE 2022-01-11 18:00:19
我试图在弹出窗口中绘制图表。它弹出。但是有一个错误。import tkinter as tkwindow = 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 rooth = 600  # height for the Tk rootx = (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”那里应该写什么?
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

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

它需要更改您的代码,但我不知道您在代码中有什么,并且您没有创建最小的工作示例。

//img1.sycdn.imooc.com//61dd555d000189ac06570521.jpg

它使用(不带)在generate_all_figures(在您的代码中将plot_sheets带有s)创建三个数字并保留在列表中。plot_sheets


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???我不记得)


查看完整回答
反对 回复 2022-01-11
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

你没有展示你如何创建你的绘图类,所以我只能在这里假设。首先创建一个空列表:


import tkinter as tk

window = tk.Tk()

window.configure(background='white')

figure_holder = []

然后在创建时附加到列表中figure:


def plot_sheets(self):

    for i in range(len(self.sheets)):

        a = self.sheets[i].plot_sheet()

        figure_holder.append(a)

figure绘制对象时从列表中检索对象:


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)


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 321 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号