一:效果展示:
本项目是基于 tkinter 图形界面的 ppt 文本提取工具,主要功能是从 ppt文件中提取所有文本内容,并支持将提取的文本保存为 .txt 格式 或 word 文档(.docx)
二:功能描述:
1. 核心功能:
(1)ppt 文件选择
- 用户可以通过界面浏览并选择本地的ppt(
.pptx)文件 - 默认将保存路径设置为与 ppt 文件同目录下的
提取的文本文件夹(自动创建)
(2)保存路径与格式设置
用户可自定义保存路径(通过文件夹选择)
支持两种保存格式:
txt 文件:纯文本格式,每段文本占一行
word 文档:通过 python-docx 库生成 .docx 文件,保留段落结构
(3)文本提取与进度显示
- 遍历 ppt 的每一页幻灯片,提取所有 ppt 中的文本框内容
- 实时更新进度条,显示当前处理的幻灯片进度
- 若 ppt 中无文本,提示用户 “ 未提取到任何文本 ”
(4)错误处理与反馈
- 捕获异常(如文件损坏、权限问题等),通过弹窗显示错误信息
- 成功提取后,弹出提示框显示保存路径
2. 技术实现:
(1)依赖库
tkinter:构建图形界面(文件对话框、按钮、进度条等)python-pptx:读取ppt(.pptx) 文件并提取文本python-docx:生成 word 文档(仅在保存为.docx时使用)os:处理文件路径(如创建目录,拼接路径)
(2)代码结构
ppttextextractorapp类封装所有功能,通过__init__初始化界面,create_widgets创建控件browse_ppt():选择 ppt 文件browse_save_path():选择保存目录extract_text():核心逻辑(提取文本→保存文件→更新进度)
三:完整代码:
import os
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from pptx import presentation
import docx
class ppttextextractorapp:
def __init__(self, root):
self.root = root
self.root.title("ppt 文本提取工具")
self.root.geometry("600x400")
# 初始化变量
self.ppt_path = tk.stringvar()
self.save_path = tk.stringvar()
self.file_format = tk.stringvar(value="txt") # 默认保存为 txt
# 创建 ui
self.create_widgets()
def create_widgets(self):
# ppt 文件选择
tk.label(self.root, text="选择 ppt 文件:").pack(pady=(10, 0), anchor="w", padx=10)
ppt_frame = tk.frame(self.root)
ppt_frame.pack(fill="x", padx=10, pady=5)
tk.entry(ppt_frame, textvariable=self.ppt_path, width=50).pack(side="left", expand=true, fill="x")
tk.button(ppt_frame, text="浏览...", command=self.browse_ppt).pack(side="right", padx=5)
# 保存路径选择
tk.label(self.root, text="保存路径:").pack(pady=(10, 0), anchor="w", padx=10)
save_frame = tk.frame(self.root)
save_frame.pack(fill="x", padx=10, pady=5)
tk.entry(save_frame, textvariable=self.save_path, width=50).pack(side="left", expand=true, fill="x")
tk.button(save_frame, text="浏览...", command=self.browse_save_path).pack(side="right", padx=5)
# 文件格式选择
tk.label(self.root, text="保存格式:").pack(pady=(10, 0), anchor="w", padx=10)
format_frame = tk.frame(self.root)
format_frame.pack(fill="x", padx=10, pady=5)
tk.radiobutton(format_frame, text="txt 文件", variable=self.file_format, value="txt").pack(side="left", padx=10)
tk.radiobutton(format_frame, text="word 文档", variable=self.file_format, value="docx").pack(side="left", padx=10)
# 提取按钮
tk.button(
self.root,
text="提取文本并保存",
command=self.extract_text,
bg="#4caf50",
fg="white",
height=2,
font=("arial", 10, "bold")
).pack(pady=20, fill="x", padx=50)
# 进度条
self.progress = ttk.progressbar(self.root, orient="horizontal", length=400, mode="determinate")
self.progress.pack(pady=10)
def browse_ppt(self):
filepath = filedialog.askopenfilename(
title="选择 ppt 文件",
filetypes=[("powerpoint 文件", "*.pptx"), ("所有文件", "*.*")]
)
if filepath:
self.ppt_path.set(filepath)
# 默认保存路径与 ppt 文件同目录
default_save_path = os.path.join(os.path.dirname(filepath), "提取的文本")
self.save_path.set(default_save_path)
def browse_save_path(self):
dirpath = filedialog.askdirectory(title="选择保存文件夹")
if dirpath:
self.save_path.set(dirpath)
def extract_text(self):
ppt_path = self.ppt_path.get()
save_path = self.save_path.get()
file_format = self.file_format.get()
if not ppt_path or not save_path:
messagebox.showwarning("警告", "请选择 ppt 文件和保存路径!")
return
try:
# 提取文本
prs = presentation(ppt_path)
data = []
total_slides = len(prs.slides)
self.progress["maximum"] = total_slides
self.progress["value"] = 0
self.root.update()
for slide_idx, slide in enumerate(prs.slides, 1):
for shape in slide.shapes:
if shape.has_text_frame:
for paragraph in shape.text_frame.paragraphs:
data.append(paragraph.text)
self.progress["value"] = slide_idx
self.root.update()
if not data:
messagebox.showinfo("提示", "未提取到任何文本!")
return
# 确保保存路径存在
os.makedirs(save_path, exist_ok=true)
# 生成文件名
ppt_name = os.path.splitext(os.path.basename(ppt_path))[0]
output_filename = f"{ppt_name}_提取的文本.{file_format}"
output_path = os.path.join(save_path, output_filename)
# 保存文件
if file_format == "txt":
with open(output_path, "w", encoding="utf-8") as f:
f.write("\n".join(data))
elif file_format == "docx":
doc = docx.document()
for text in data:
doc.add_paragraph(text)
doc.save(output_path)
messagebox.showinfo("成功", f"文本已成功提取并保存至:\n{output_path}")
self.progress["value"] = 0
except exception as e:
messagebox.showerror("错误", f"发生错误:\n{str(e)}")
self.progress["value"] = 0
if __name__ == "__main__":
root = tk.tk()
app = ppttextextractorapp(root)
root.mainloop()
四:代码分析
1. 导入模块
# os: 用于操作系统相关功能,如路径处理 import os # tkinter: 用于创建图形用户界面(gui) import tkinter as tk """ filedialog: 用于文件选择对话框 messagebox: 显示消息对话框 ttk: 提供进度条等小部件 """ from tkinter import filedialog, messagebox, ttk # pptx.presentation: 用于读取ppt文件 from pptx import presentation # docx: 用于创建word文档 import docx
2. 主应用类定义
# 定义主应用类 ppttextextractorapp
class ppttextextractorapp:
def __init__(self, root):
# 初始化方法设置窗口标题和大小(600x400像素)
self.root = root
self.root.title("ppt 文本提取工具")
self.root.geometry("600x400")
3. 初始化变量
# 初始化变量,创建三个tkinter变量用于存储 """ ppt_path: 选择的ppt文件路径 save_path: 保存结果的路径 file_format: 输出格式(默认为txt) """ self.ppt_path = tk.stringvar() self.save_path = tk.stringvar() self.file_format = tk.stringvar(value="txt")
4. 创建ui界面
def create_widgets(self):
# ppt 文件选择(包含标签、输入框和浏览按钮)
tk.label(self.root, text="选择 ppt 文件:").pack(pady=(10, 0), anchor="w", padx=10)
ppt_frame = tk.frame(self.root)
ppt_frame.pack(fill="x", padx=10, pady=5)
tk.entry(ppt_frame, textvariable=self.ppt_path, width=50).pack(side="left", expand=true, fill="x")
tk.button(ppt_frame, text="浏览...", command=self.browse_ppt).pack(side="right", padx=5)
# 保存路径选择
tk.label(self.root, text="保存路径:").pack(pady=(10, 0), anchor="w", padx=10)
save_frame = tk.frame(self.root)
save_frame.pack(fill="x", padx=10, pady=5)
tk.entry(save_frame, textvariable=self.save_path, width=50).pack(side="left", expand=true, fill="x")
tk.button(save_frame, text="浏览...", command=self.browse_save_path).pack(side="right", padx=5)
# 文件格式选择(单选按钮组,选择 txt 或 word 格式)
tk.label(self.root, text="保存格式:").pack(pady=(10, 0), anchor="w", padx=10)
format_frame = tk.frame(self.root)
format_frame.pack(fill="x", padx=10, pady=5)
tk.radiobutton(format_frame, text="txt 文件", variable=self.file_format, value="txt").pack(side="left", padx=10)
tk.radiobutton(format_frame, text="word 文档", variable=self.file_format, value="docx").pack(side="left", padx=10)
# 提取按钮(绿色按钮,点击触发提取操作)
tk.button(
self.root,
text="提取文本并保存",
command=self.extract_text,
bg="#4caf50",
fg="white",
height=2,
font=("arial", 10, "bold")
).pack(pady=20, fill="x", padx=50)
# 进度条
self.progress = ttk.progressbar(self.root, orient="horizontal", length=400, mode="determinate")
self.progress.pack(pady=10)
5. 浏览ppt文件
def browse_ppt(self):
filepath = filedialog.askopenfilename(
title="选择 ppt 文件",
# 限制为.pptx文件
filetypes=[("powerpoint 文件", "*.pptx"), ("所有文件", "*.*")]
)
if filepath:
self.ppt_path.set(filepath)
# 默认保存路径与 ppt 文件同目录
default_save_path = os.path.join(os.path.dirname(filepath), "提取的文本")
self.save_path.set(default_save_path)
以上就是基于python和tkinter实现ppt文本提取工具的详细内容,更多关于python tkinter实现ppt文本提取的资料请关注代码网其它相关文章!


发表评论