AttributeError:'_tkinter.tkapp'对象没有属性'TclError'

时间:2019-12-24 09:36:04

标签: python matplotlib tkinter

我正在尝试在tkinter窗口中嵌入matplotlib图,并在将其用于主要代码之前,使用以下代码作为基础。

https://matplotlib.org/gallery/user_interfaces/embedding_in_tk_canvas_sgskip.html

如果我运行下面的代码,则会出现以下错误:

AttributeError:'_tkinter.tkapp'对象没有属性'TclError'

代码:

import matplotlib as mpl
import numpy as np
import sys
import tkinter as tk
import matplotlib.backends.tkagg as tkagg
from matplotlib.backends.backend_agg import FigureCanvasAgg


def draw_figure(canvas, figure, loc=(0, 0)):
    #Draw a matplotlib figure onto a Tk canvas. loc: location of top-left corner of figure on canvas in pixels. Inspired by matplotlib source: lib/matplotlib/backends/backend_tkagg.py

    figure_canvas_agg = FigureCanvasAgg(figure)
    figure_canvas_agg.draw()
    figure_x, figure_y, figure_w, figure_h = figure.bbox.bounds
    figure_w, figure_h = int(figure_w), int(figure_h)
    photo = tk.PhotoImage(master=canvas, width=figure_w, height=figure_h)

    # Position: convert from top-left anchor to center anchor
    canvas.create_image(loc[0] + figure_w/2, loc[1] + figure_h/2, image=photo)

    # Unfortunately, there's no accessor for the pointer to the native renderer
    tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2)

    # Return a handle which contains a reference to the photo object
    # which must be kept live or else the picture disappears
    return photo

# Create a canvas
w, h = 300, 200
window = tk.Tk()
window.title("A figure in a canvas")
canvas = tk.Canvas(window, width=w, height=h)
canvas.pack()

# Generate some example data
X = np.linspace(0, 2 * np.pi, 50)
Y = np.sin(X)

# Create the figure we desire to add to an existing canvas
fig = mpl.figure.Figure(figsize=(2, 1))
ax = fig.add_axes([0, 0, 1, 1])
ax.plot(X, Y)

# Keep this handle alive, or else figure will disappear
fig_x, fig_y = 100, 100
fig_photo = draw_figure(canvas, fig, loc=(fig_x, fig_y))
fig_w, fig_h = fig_photo.width(), fig_photo.height()

# Add more elements to the canvas, potentially on top of the figure
canvas.create_line(200, 50, fig_x + fig_w / 2, fig_y + fig_h / 2)
canvas.create_text(200, 50, text="Zero-crossing", anchor="s")

# Let Tk take over
tk.mainloop()

有人可以帮助我解决此错误吗?对于不同的属性(“选择”,“ getitems”,“文本”,“ PassCheck”等),我在堆栈溢出中发现了类似的问题。谢谢。

1 个答案:

答案 0 :(得分:1)

import matplotlib as mpl替换为:

from matplotlib.figure import Figure

然后将import matplotlib.backends.tkagg as tkagg替换为

from matplotlib.backends import _backend_tk

最后,替换行:

tkagg.blit(photo, figure_canvas_agg.get_renderer()._renderer, colormode=2)

具有:

_backend_tk.blit(
    photo, figure_canvas_agg.get_renderer()._renderer, (0, 1, 2, 3))

查看是否有效。 您可能要引用此合并请求:https://github.com/matplotlib/matplotlib/pull/11507/commits/9dfd6118f221ace2a3e0c8f43ef3e2e37186fa15