如何在Python3.6的Tkinter中用Matplotlib Figure绘制环形图?
把Matplotlib环形图嵌入Tkinter窗口的解决方案
嗨,我帮你把代码调整好了,完美适配Python3.6+Tkinter的环境,核心思路就是用Matplotlib的面向对象API(matplotlib.figure.Figure)替代pyplot,再通过FigureCanvasTkAgg把绘图组件整合到Tkinter窗口里。
直接上可运行的完整代码:
import tkinter as tk from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg # 创建Tkinter主窗口 root = tk.Tk() root.title("Tkinter里的环形图") # 1. 创建Matplotlib的Figure对象(替代pyplot的plt.figure) fig = Figure(figsize=(5, 4), dpi=100) # 2. 添加子图到Figure ax = fig.add_subplot(111) # 3. 准备环形图的数据和配置 data = [20, 30, 50] labels = ["A", "B", "C"] # 设置环形的宽度,0.3就是中间空白的大小 wedgeprops = {'width': 0.3} # 4. 绘制环形图 ax.pie(data, labels=labels, wedgeprops=wedgeprops, autopct='%1.1f%%') # 保证饼图是正圆形 ax.axis('equal') # 5. 创建Tkinter兼容的Canvas组件,把Figure绑定进去 canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() # 把Canvas放到窗口里(用pack/grid都可以) canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1) # 启动Tkinter主循环 tk.mainloop()
关键细节说明:
- 为什么不用
pyplot?因为pyplot是基于全局状态的绘图方式,嵌入GUI时容易出现线程冲突和资源管理问题,用matplotlib.figure.Figure的面向对象方式更适合GUI集成。 wedgeprops={'width':0.3}是实现环形图的核心参数,调整这个值可以改变环形的粗细。FigureCanvasTkAgg是Matplotlib专门为Tkinter提供的后端组件,负责把Matplotlib的绘图内容渲染成Tkinter能识别的控件。- 最后一定要调用
canvas.draw()来触发绘图渲染,不然窗口里只会显示空白。
你可以直接把这段代码运行起来,就能看到Tkinter窗口里显示的环形图了,也可以根据自己的需求修改数据、标签或者样式~
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

