python Matplotlib Tkinter-->导出pdf报表

环境

python:python-3.12.0-amd64

包:

matplotlib 3.8.2

reportlab 4.0.9
python 复制代码
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
import tkinter as tk
import tkinter.messagebox as messagebox
import tkinter.ttk as ttk
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.lib.units import inch
from reportlab.platypus import Table, TableStyle, SimpleDocTemplate, Image
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from io import BytesIO

# 加载中文字体
font_path = r'C:\Windows\Fonts\STZHONGS.TTF'
pdfmetrics.registerFont(TTFont('SimHei', font_path))
print(pdfmetrics.getRegisteredFontNames())


# 导出 PDF 报表
def export_pdf():
    # 将 matplotlib 图形转化为图像
    buf = BytesIO()
    fig1.savefig(buf, format='png', dpi=80)
    buf.seek(0)
    img = Image(buf, width=8 * inch, height=3 * inch)

    # 创建 PDF 表格
    data = [['堆体体积盘点报表', 'col2', 'col3', 'col4', 'col5', 'col6', 'col7', 'col8'],
            ['名称', '堆体长度', '堆体宽度', '堆体高度', '占地面积', '堆体体积', '堆体密度', '堆体重量'],
            ['1号仓', '36.022', '36.024', '35.063', '1019.495', '28105.247', '0.540', '15176.833'],
            ['制表人:', '', '审核人:', '', '经理:', '', '日期:', '2022-7-9'],
            ['堆体三维立体效果图', '', '', 'row4', '', '', '', ''],
            [img, '', '', '', 'row5', '', '', ''],
            ['内容7', '', '', '', '', 'row6', '', '']]
    table = Table(data, colWidths=[1 * inch] * 8, rowHeights=[0.5 * inch] * 5 + [3.1 * inch] * 2)
    table.setStyle(TableStyle([
        ('TEXTCOLOR', (0, 0), (-1, 0), colors.black),
        ('ALIGN', (0, 0), (-1, 0), 'CENTER'),
        ('FONTNAME', (0, 0), (-1, 0), 'SimHei'),
        ('FONTSIZE', (0, 0), (-1, 0), 14),
        ('BOTTOMPADDING', (0, 0), (-1, 0), 16),

        ('SPAN', (0, 0), (7, 0)),
        ('SPAN', (0, 4), (7, 4)),
        ('SPAN', (0, 5), (7, 5)),
        ('SPAN', (0, 6), (7, 6)),

        ('TEXTCOLOR', (0, 1), (-1, -1), colors.black),
        ('ALIGN', (0, 1), (-1, -1), 'CENTER'),
        ('FONTNAME', (0, 1), (-1, -1), 'SimHei'),

        ('FONTSIZE', (0, 4), (-1, 4), 14),
        ('BOTTOMPADDING', (0, 1), (-1, -1), 16),
        ('GRID', (0, 0), (-1, -1), 1, colors.black)
    ]))

    # 保存 PDF 文件并显示导出成功的消息框
    pdf_file = SimpleDocTemplate("三维激光雷达 1号仓体积报表20220709.pdf", pagesize=letter)
    pdf_file.build([table])
    messagebox.showinfo('导出成功', 'PDF 文件已成功导出!')


# 创建自定义工具栏类
class MyNavigationToolbar(NavigationToolbar2Tk):
    toolitems = [('Home', '回到初始状态', 'home', 'home'),
                 ('Back', '后退', 'back', 'back'),
                 ('Home', '前进', 'forward', 'forward'),
                 ('Pan', '平移', 'move', 'pan'),
                 ('Zoom', '缩放', 'zoom_to_rect', 'zoom'),
                 ('Save', '保存', 'filesave', 'save_figure')]

    def __init__(self, *args, **kwargs):
        show_toolbar = kwargs.pop('show_toolbar', True)
        super().__init__(*args, **kwargs)
        if not show_toolbar:
            self.pack_forget()
        self.custom_button_img1 = tk.PhotoImage(file='figure_pic1.png')  # 创建第一个图片按钮
        self.custom_button1 = ttk.Button(self, image=self.custom_button_img1, command=lambda: print('111.'))
        self.custom_button1.pack(side=tk.LEFT)  # 添加按钮到工具栏上
        self.custom_button_img2 = tk.PhotoImage(file='figure_pic2.png')  # 创建第二个图片按钮
        self.custom_button2 = ttk.Button(self, image=self.custom_button_img2, command=export_pdf)
        self.custom_button2.pack(side=tk.LEFT)  # 添加按钮到工具栏上


# 创建 Tkinter 窗口
window = tk.Tk()
window.title("Matplotlib in Tkinter")

# 设置窗口大小和位置
window.geometry('800x600')

# 创建选项卡控件
notebook = ttk.Notebook(window)

# 创建第一个选项卡
tab1 = ttk.Frame(notebook)
fig1 = plt.figure()
plt.plot([1, 2, 3], [4, 5, 6])
canvas1 = FigureCanvasTkAgg(fig1, master=tab1)
canvas1.draw()
toolbar1 = MyNavigationToolbar(canvas1, tab1)
toolbar1.update()
toolbar1.pack(side=tk.TOP, fill=tk.X, padx=5, pady=5)
canvas1.get_tk_widget().pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
notebook.add(tab1, text='图表1')

# 创建第二个选项卡
tab2 = ttk.Frame(notebook)
fig2 = plt.figure()
plt.plot([3, 2, 1], [6, 5, 4])
canvas2 = FigureCanvasTkAgg(fig2, master=tab2)
canvas2.draw()
toolbar2 = MyNavigationToolbar(canvas2, tab2, show_toolbar=False)
toolbar2.update()
canvas2.get_tk_widget().pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
notebook.add(tab2, text='图表2')

notebook.pack(fill=tk.BOTH, expand=True)

window.mainloop()

注:

C:\Windows\Fonts\STZHONGS.TTF

STZHONGS.TTF 此名称是文件夹C:\Windows\Fonts\下面的文件属性里面的名称

图片资源下载(分享-->python Matplotlib Tkinter图片):

链接:https://pan.baidu.com/s/1vFOU52gG0bgK8RYuj-dzOg

提取码:2oy0

相关推荐
荣码6 分钟前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑
java·python
databook1 小时前
Pandas 与 Polars:语法、性能和资源占用方面的对比
python·数据分析·pandas
威哥爱编程1 小时前
Python 智能体开发实战 10:本地跑得好好的,一并发就崩?把它做成一个能上线的服务
python·agent
威哥爱编程1 小时前
Python 智能体开发实战 09:改了提示词,到底是变好还是变坏?搭一套能打分的离线评测
python·agent
meiying88382 小时前
多快递公司快递单号批量查询接口怎么对接?Python 聚合查询实现
java·大数据·python
Hello_Pyhx2 小时前
Deep-Live-Cam 源码配置思路:环境、模型与执行后端分开排查
python
张张123y2 小时前
后端第十六课:Multi-Agent 多智能体(让多个 Agent 分工协作)
大数据·数据库·人工智能·python·deepseek·dsh·agent 框架
全栈练习生3 小时前
大规模智能体仿真
python·ai
code2cat3 小时前
【随笔】vLLM前缀缓存:相同的开头怎样少算一次
人工智能·python·缓存·vllm
陈飞EXCEL3 小时前
北京杰飞 IT 旗下妙码生花少儿Python编程上线两大学习系统
开发语言·python·学习