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

相关推荐
m0_7020365312 小时前
mysql如何通过索引减少行锁范围_mysql索引与加锁逻辑
jvm·数据库·python
用户03321266636712 小时前
使用 Python 设置 Word 文档文本的颜色
python
qxwlcsdn12 小时前
如何用 IndexedDB 存储从 API 获取的超大列表并实现二级索引
jvm·数据库·python
小新同学^O^12 小时前
简单学习 --> 模型微调
开发语言·人工智能·python·模型微淘
2301_8092445313 小时前
C#怎么使用协变和逆变 C#泛型中的in和out关键字协变逆变是什么意思怎么用【语法】
jvm·数据库·python
知识汲取者13 小时前
巨量引擎营销 API 完整文档
开发语言·数据库·python
DevnullCoffe13 小时前
用 MCP 让 AI Agent 直接批量下载亚马逊商品图片——原理、踩坑与实现
爬虫·python·api
时光Autistic13 小时前
【安装教程】AI标注工具X-AnyLabeling安装配置
人工智能·python
knight_9___14 小时前
大模型project面试7
人工智能·python·算法·面试·大模型·agent
yuhuofei202114 小时前
【Python入门】Python与PyCharm的安装
开发语言·python·pycharm