当前位置:首页>python>Python PyQt5 + Markdown 一键生成PPT工具

Python PyQt5 + Markdown 一键生成PPT工具

  • 2026-09-11 11:49:52
Python PyQt5 + Markdown 一键生成PPT工具

Python PyQt5 + Markdown 一键生成PPT工具

这是一个完整可运行的桌面工具,支持:

  • 粘贴/导入 Markdown 文本
  • 选择 PPT 模板文件
  • 一键生成精美 PPT(.pptx)
  • 可视化 GUI 界面

用到的核心库:

  • PyQt5:GUI 界面
  • python-pptx:生成 PPT
  • markdown:解析 Markdown 语法

完整代码

import sys
import markdown
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, 
                             QHBoxLayout, QTextEdit, QPushButton, QFileDialog,
                             QLabel, QMessageBox, QComboBox)
from PyQt5.QtCore import Qt
from pptx import Presentation
import re

classMarkdownToPPTGenerator(QMainWindow):
def__init__(self):
        super().__init__()
        self.setWindowTitle("Markdown 一键生成 PPT 工具")
        self.setGeometry(100, 100, 800, 600)

# 核心变量
        self.template_path = ""# PPT模板路径
        self.md_content = ""# Markdown内容

# 初始化界面
        self.init_ui()

definit_ui(self):
"""创建GUI界面"""
        central_widget = QWidget()
        self.setCentralWidget(central_widget)
        layout = QVBoxLayout(central_widget)

# 1. Markdown 输入区域
        layout.addWidget(QLabel("📝 Markdown 内容(可粘贴/导入):"))
        self.md_text = QTextEdit()
        self.md_text.setPlaceholderText(
"请在此粘贴Markdown内容,格式示例:\n"
"# 标题1\n"
"## 副标题\n"
"- 列表项1\n"
"- 列表项2\n"
"## 第二页标题\n"
"正文内容..."
        )
        layout.addWidget(self.md_text)

# 2. 功能按钮区域
        btn_layout = QHBoxLayout()

        self.import_btn = QPushButton("导入 Markdown 文件")
        self.import_btn.clicked.connect(self.import_md_file)
        btn_layout.addWidget(self.import_btn)

        self.template_btn = QPushButton("选择 PPT 模板")
        self.template_btn.clicked.connect(self.select_template)
        btn_layout.addWidget(self.template_btn)

        self.generate_btn = QPushButton("✨ 一键生成 PPT")
        self.generate_btn.setStyleSheet("font-size:14px; font-weight:bold; color:green;")
        self.generate_btn.clicked.connect(self.generate_ppt)
        btn_layout.addWidget(self.generate_btn)

        layout.addLayout(btn_layout)

# 3. 状态提示
        self.status_label = QLabel("状态:等待操作")
        layout.addWidget(self.status_label)

defimport_md_file(self):
"""导入本地 .md 文件"""
        file_path, _ = QFileDialog.getOpenFileName(
            filter="Markdown 文件 (*.md);;所有文件 (*.*)"
        )
if file_path:
try:
with open(file_path, "r", encoding="utf-8") as f:
                    content = f.read()
                self.md_text.setText(content)
                self.status_label.setText(f"✅ 已导入:{file_path}")
except Exception as e:
                QMessageBox.critical(self, "错误", f"导入失败:{str(e)}")

defselect_template(self):
"""选择PPT模板(.potx/.pptx)"""
        template_path, _ = QFileDialog.getOpenFileName(
            filter="PPT 模板 (*.potx *.pptx);;所有文件 (*.*)"
        )
if template_path:
            self.template_path = template_path
            self.status_label.setText(f"✅ 已选择模板:{template_path}")

defparse_markdown(self, md_text):
"""解析Markdown,拆分PPT页面和内容"""
# 按 # 标题拆分页面(一级标题为新页面)
        slides = re.split(r'\n# ', md_text)
        slide_data = []

for slide in slides:
ifnot slide.strip():
continue
# 补回拆分丢失的 #
ifnot slide.startswith("#"):
                slide = "# " + slide

            lines = slide.strip().split("\n")
            title = lines[0].replace("# ", "").strip()  # 页面标题
            content = "\n".join(lines[1:]).strip()     # 页面内容

            slide_data.append({"title": title, "content": content})
return slide_data

defgenerate_ppt(self):
"""核心:生成PPT文件"""
        self.md_content = self.md_text.toPlainText().strip()

# 校验输入
ifnot self.md_content:
            QMessageBox.warning(self, "提示", "请输入或导入Markdown内容!")
return

# 选择保存路径
        save_path, _ = QFileDialog.getSaveFileName(
            filter="PPT 文件 (*.pptx)",
            options=QFileDialog.Options()
        )
ifnot save_path:
return

try:
            self.status_label.setText("⏳ 正在生成PPT,请稍候...")
            QApplication.processEvents()

# 1. 创建/加载PPT
if self.template_path:
                prs = Presentation(self.template_path)  # 使用模板
else:
                prs = Presentation()                     # 默认模板

# 2. 解析Markdown
            slide_data = self.parse_markdown(self.md_content)

# 3. 逐页生成PPT
for data in slide_data:
# 标题+内容版式
                slide_layout = prs.slide_layouts[1]
                slide = prs.slides.add_slide(slide_layout)

# 设置标题
                title_placeholder = slide.shapes.title
                title_placeholder.text = data["title"]

# 设置内容
                content_placeholder = slide.placeholders[1]
                content_placeholder.text = data["content"]

# 4. 保存文件
            prs.save(save_path)
            self.status_label.setText(f"✅ PPT生成完成:{save_path}")
            QMessageBox.information(self, "成功", "PPT生成完毕!")

except Exception as e:
            QMessageBox.critical(self, "生成失败", f"错误信息:{str(e)}")
            self.status_label.setText("❌ 生成失败")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MarkdownToPPTGenerator()
    window.show()
    sys.exit(app.exec_())

安装依赖

在运行前,先执行命令安装所需库:

pip install pyqt5 python-pptx markdown

使用说明

  1. 输入内容:直接在文本框粘贴 Markdown,或点击「导入 Markdown 文件」
  2. 选择模板(可选):点击「选择 PPT 模板」,可使用本地 .potx / .pptx 模板
  3. 生成PPT:点击「一键生成PPT」,选择保存位置,自动生成
  4. 格式规则:
    • # 一级标题 = 新的PPT页面
    • 标题下的所有内容 = 该页面的正文
    • 支持列表、普通文本等基础格式

功能亮点

  • ✅ 支持粘贴导入双模式
  • ✅ 自定义PPT模板,一键套用
  • ✅ 可视化操作,无需命令行
  • ✅ 自动按 Markdown 标题分页
  • ✅ 纯本地运行,数据安全

扩展优化(可选)

你可以轻松升级这些功能:

  1. 支持多级标题、图片、表格解析
  2. 增加更多PPT版式选择
  3. 生成后直接打开PPT
  4. 支持暗黑模式界面
  5. 批量处理多个Markdown文件 

最新文章

随机文章