当前位置:   article > 正文

Python将matplotlib嵌入到tkinter中_python matplotlib与tkinter间的交互

python matplotlib与tkinter间的交互

matplotlib窗口组成

tkinter是Python标准库中自带的GUI工具,使用十分方便,如能将matplotlib嵌入到tkinter中,就可以做出相对专业的数据展示系统,很有竞争力。

在具体实现之前,可以先看一下典型的matplotlib窗口

import numpy as np
import matplotlib.pyplot as plt

plt.plot(np.arange(100))
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
'
运行

然后就看到了我们熟悉的plot图

plot图

这个图由两部分构成,分别是上面用于绘图的FigureCanvasTkAgg画布,以及下方的工具栏NavigationToolbar2Tk,二者存放在matplotlib.backends.backend_tkagg中,这两个组件在地位上和tkinter中的组件是等同的。

但除此之外还不够,因为画布并不意味着有图像,故而还要导入绘图窗口Figure,故而将matplotlib嵌入到tkinter中,最少需要使用下面的这些模块

import tkinter as tk
import tkinter.ttk as ttk

import matplotlib as mpl
mpl.use('TkAgg')        # 启用tkinter渲染matplotlib,从而可以嵌入到tkinter中
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (
    FigureCanvasTkAgg, NavigationToolbar2Tk)
from matplotlib.figure import Figure

import numpy as np
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
'
运行

其中,mpl.use(‘TkAgg’)用于启用tkinter渲染matplotlib,从而可以嵌入到tkinter中。

tkinter布局

在了解原理之后,具体实现就不难了。在嵌入matplotlib之前,可先对tkinter窗口做下布局,代码如下所示,首先创建一个标题为"数据展示工具"的窗口root,并为其添加两个控件,分别是右侧的frmCtrl和左侧的frmFigure,前者用于添加控件,后者用于嵌入图像

root = tk.Tk()
root.title("数据展示工具")
frmCtrl = ttk.Frame(root, width=200)
frmCtrl.pack(side=tk.RIGHT)

frmFigure = ttk.Frame(root)
frmFigure.pack(side=tk.LEFT, fill=tk.BOTH, expand=tk.YES)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

嵌入图像

正如一开始所说的,matplotlib的绘图窗口由两部分构成,分别是绘图画布和工具栏,而绘图画布又要包含图像,所以先创建一个Figure,在将其导入到FigureCanvasTkAgg中。

fig = Figure()
canvas = FigureCanvasTkAgg(fig,frmFigure)
canvas.get_tk_widget().pack(
    side=tk.TOP,fill=tk.BOTH,expand=tk.YES)
toolbar = NavigationToolbar2Tk(canvas,frmFigure,
    pack_toolbar=False)
toolbar.update()
toolbar.pack(side=tk.RIGHT)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中,canvas是绘图画布,toolbar是工具栏。至此,就已经完成了图像的嵌入工作,接下来要做的,就是跑死循环,从而把这个嵌入了绘图工具的窗口显示出来

root.mainloop()

结果如下

在这里插入图片描述
这个图的左侧显然就是matplotlib引入的绘图画布,右侧则是frmCtrl,主要是为了更加清晰地证明,画布的确嵌入到了tkinter窗口中。

如果觉得不过瘾,可以在创建fig之后,再画一个图像上去,代码如下

ax = fig.add_subplot()
ax.plot(np.arange(100))
  • 1
  • 2

然后再执行root.mainloop(),就可以得到下图

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/884278
推荐阅读
相关标签
  

闽ICP备14008679号