Pytohn将matplotlib嵌入到tkinter中

news/2025/2/2 5:59:14/

文章目录

    • matplotlib窗口组成
    • tkinter布局
    • 嵌入图像

matplotlib窗口组成

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

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

import numpy as np
import matplotlib.pyplot as pltplt.plot(np.arange(100))
plt.show()

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

plot图

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

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

import tkinter as tk
import tkinter.ttk as ttkimport 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 Figureimport numpy as np

其中,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)

嵌入图像

正如一开始所说的,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)

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

root.mainloop()

结果如下

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

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

ax = fig.add_subplot()
ax.plot(np.arange(100))

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

在这里插入图片描述


http://www.ppmy.cn/news/1008733.html

相关文章

使用PHP和Redis实现简单秒杀功能

安装Redis 首先,需要在服务器上安装Redis。如果使用Linux系统,可以使用命令行安装。如果使用Windows系统,可以下载并安装Redis二进制文件。 创建Redis连接 在PHP中,可以使用Redis扩展来连接Redis服务器。需要在PHP文件中包含Re…

自问自答----WEB篇

目录 1、https和http协议的端口 2、http协议的版本 3、linux中查看报文的方法 3.1 curl www.baidu.com -v 3.2 wget --debug www.baidu.com 4、http有哪些请求方法 5、http的请求头 6、http响应头​编辑 7、状态码有哪些 8、uri和url 9、静态?动态&#x…

频繁设置CGroup触发linux内核bug导致CGroup running task不调度

2. 问题 2.1 触发bug code(code较长,请展开代码) 2.1.1 code View Code 2.1.2 编译 g -stdc11 -lpthread trigger_cgroup_timer_inactive.cpp -o inactive_timer 2.1.3 在CentOS7.0~7.5的系统上执行程序 ./inactive_timer 100000 10000 2.1.4 上述代码主要干了2…

跨cpu架构部署容器技术点:怎么将容器启动时的1号进程挂载到systemctl

在某些时候,我们除去容器内本身的打包好的程序,我们还会需要一些依赖服务,这些服务通常是挂载在一号进程上通过 systemctl这个控制器服务来维护。 但因为docker的最小工作原则,info进程,或者说 systemctl控制程序&…

1、二分搜索法

二分搜索法 易混点: 1.left是小于right还是小于等于right 2.更新的时候是更新到mildle还是midle-1 3.区间是 [left,right] 还是 [left,right),对区间的定义不同会影响到边界的处理 左闭右闭写法 伪代码 left 0; right numsize - 1; while(left &l…

网络安全设备及部署

什么是等保定级? 之前了解了下等保定级,接下里做更加深入的探讨 文章目录 一、网路安全大事件1.1 震网病毒1.2 海康威视弱口令1.3 物联网Mirai病毒1.4 专网 黑天安 事件1.5 乌克兰停电1.6 委内瑞拉电网1.7 棱镜门事件1.8 熊猫烧香 二、法律法规解读三、安…

1-redis介绍

1.redis介绍 Redis(Remote Dictionary Server),即远程字典服务。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis是一个key-value存储系统。 和Memcached缓存类似,Redis支持存储的value类型相…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十八天 48/50【字符串处理】【最低公共祖先】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…