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

相关推荐
紫雾凌寒40 分钟前
计算机视觉 |解锁视频理解三剑客——TimeSformer
python·深度学习·神经网络·计算机视觉·transformer·timesformer
程序员杰哥1 小时前
测试用例详解
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
go54631584657 小时前
本地部署 GitHub 上的 Python 人脸识别项目
开发语言·python·github
FreakStudio8 小时前
手把手教你用 MicroPython 玩转幻尔串口舵机,代码+教程全公开
python·嵌入式·大学生·面向对象·技术栈·电子diy·电子计算机
tekin8 小时前
基于 Python 开发在线多人游戏服务器案例解析
服务器·python·游戏·在线多人游戏服务器
让学习成为一种生活方式10 小时前
libGL.so.1: cannot open shared object file: No such file or directory-linux022
linux·开发语言·python
java1234_小锋10 小时前
一周学会Flask3 Python Web开发-Jinja2模板继承和include标签使用
python·flask·flask3
图书馆钉子户11 小时前
from flask_session import Session 为什么是Session(app)这么用?
python·flask·mybatis
一只蜗牛儿11 小时前
Sherpa-ONNX:说话人识别与语音识别自动开启(VAD)+ Python API 完整指南
人工智能·python·语音识别
结衣结衣.11 小时前
【OpenCV】入门教学
图像处理·人工智能·python·opencv