加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 使用Matplotlib和tkinter(TkAgg)

发布时间:2020-12-20 13:10:33 所属栏目:Python 来源:网络整理
导读:我一直有使用tkinter运行 Matplotlib的一致问题.这种情况发生在我的代码和其他代码中,包括我从网上下载的示例代码,可能适用于其他代码. 当我使用IPython控制台而不是标准的Python控制台时,会发生matplotlib.use(‘TkAgg’)的初始用户警告.我认为这只是意味着
我一直有使用tkinter运行 Matplotlib的一致问题.这种情况发生在我的代码和其他代码中,包括我从网上下载的示例代码,可能适用于其他代码.

当我使用IPython控制台而不是标准的Python控制台时,会发生matplotlib.use(‘TkAgg’)的初始用户警告.我认为这只是意味着IPython更加冗长,因为在任何一种情况下,程序都会在canvas.show()上崩溃.我一直试图运行的完整代码来自Matplotlib网站:

#!/usr/bin/env python

import matplotlib
matplotlib.use('TkAgg')

from numpy import arange,sin,pi
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,NavigationToolbar2TkAgg
# Implement the default mpl key bindings
from matplotlib.backend_bases import key_press_handler


from matplotlib.figure import Figure

import sys
if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
    import tkinter as Tk

root = Tk.Tk()
root.wm_title("Embedding in TK")


f = Figure(figsize=(5,4),dpi=100)
a = f.add_subplot(111)
t = arange(0.0,3.0,0.01)
s = sin(2*pi*t)

a.plot(t,s)


# A tk.DrawingArea
canvas = FigureCanvasTkAgg(f,master=root)
canvas.show()
canvas.get_tk_widget().pack(side=Tk.TOP,fill=Tk.BOTH,expand=1)

toolbar = NavigationToolbar2TkAgg(canvas,root)
toolbar.update()
canvas._tkcanvas.pack(side=Tk.TOP,expand=1)


def on_key_event(event):
    print('you pressed %s' % event.key)
    key_press_handler(event,canvas,toolbar)

canvas.mpl_connect('key_press_event',on_key_event)


def _quit():
    root.quit()     # Stops mainloop
    root.destroy()  # This is necessary on Windows to prevent
                    # Fatal Python Error: PyEval_RestoreThread: NULL tstate

button = Tk.Button(master=root,text='Quit',command=_quit)
button.pack(side=Tk.BOTTOM)

Tk.mainloop()
# If you put root.destroy() here,it will cause an error if
# the window is closed with the window manager.

使用调试器我跟随canvas.show到tkinter(backend_tkagg.py):

def draw(self):
    FigureCanvasAgg.draw(self)
    tkagg.blit(self._tkphoto,self.renderer._renderer,colormode=2)
    self._master.update_idletasks()

我跳过FigureCanvasAgg.draw ok并进入tkagg.blit …注意传递给tkagg.blit的数据都不是应用程序数据.这个调用带我去tkagg.py,即:

def blit(photoimage,aggimage,bbox=None,colormode=1):
    tk = photoimage.tk

    if bbox is not None:
        bbox_array = bbox.__array__()
    else:
        bbox_array = None
    data = np.asarray(aggimage)
    try:
        tk.call("PyAggImagePhoto",photoimage,id(data),colormode,id(bbox_array))
    except Tk.TclError:
        try:
            try:
                _tkagg.tkinit(tk.interpaddr(),1)
            except AttributeError:
                _tkagg.tkinit(id(tk),0)
            tk.call("PyAggImagePhoto",id(bbox_array))
        except (ImportError,AttributeError,Tk.TclError):
            raise

它在tk.call上反复失败的地方,我认为这是对Tcl的调用.

我在这里修改了代码以将TclError作为变量捕获,因此我可以在调试器中检查它.它说:tclErr:无效的命令名称“PyAggImagePhoto”

我该怎么做?

解决方法

总结一下:

> OP的问题是打包问题,因为在构建时安装了依赖项(而不是).
>这已经在https://github.com/matplotlib/matplotlib/pull/6442上游修复,mpl> = 1.5.2应该没有这个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读