这是一个完整可运行的桌面工具,支持:
用到的核心库:
完整代码
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
使用说明
- 输入内容:直接在文本框粘贴 Markdown,或点击「导入 Markdown 文件」
- 选择模板(可选):点击「选择 PPT 模板」,可使用本地 .potx / .pptx 模板
- 生成PPT:点击「一键生成PPT」,选择保存位置,自动生成
功能亮点
扩展优化(可选)
你可以轻松升级这些功能: