基于Python和Tkinter实现一个PPT文本提取工具
更新时间:2025年11月28日 09:39:43 作者:温轻舟
这篇文章主要介绍了基于tkinter和python-pptx库的PPT文本提取工具,支持将提取的文本保存为TXT或Word文档,并提供了进度显示和错误处理功能,需要的朋友可以参考下
一:效果展示:
本项目是基于 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文本提取的资料请关注脚本之家其它相关文章!
相关文章
DRF跨域后端解决之django-cors-headers的使用
这篇文章主要介绍了DRF跨域后端解决之django-cors-headers的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-01-01
Python3.5 Pandas模块之Series用法实例分析
这篇文章主要介绍了Python3.5 Pandas模块之Series用法,结合实例形式分析了Python3.5中Pandas模块的Series结构原理、创建、获取、运算等相关操作技巧与注意事项,需要的朋友可以参考下2019-04-04




最新评论