基于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文本提取的资料请关注脚本之家其它相关文章!

相关文章

  • Python实现快速多线程ping的方法

    Python实现快速多线程ping的方法

    这篇文章主要介绍了Python实现快速多线程ping的方法,实例分析了Python多线程及ICMP数据包的发送技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • python datetime 和时间戳互相转换问题

    python datetime 和时间戳互相转换问题

    time和datetime都是Python中的内置模块(不需要安装,直接可以使用),都可以对时间进行获取,对时间格式进行转换,如时间戳和时间字符串的相互转换,本文先给大家介绍python datetime 和时间戳互转问题,感兴趣的朋友一起看看吧
    2022-11-11
  • python使用xmlrpclib模块实现对百度google的ping功能

    python使用xmlrpclib模块实现对百度google的ping功能

    这篇文章主要介绍了python使用xmlrpclib模块实现对百度google的ping功能,实例分析了xmlrpclib模块的相关技巧,需要的朋友可以参考下
    2015-06-06
  • python实现文本去重且不打乱原本顺序

    python实现文本去重且不打乱原本顺序

    这篇文章主要介绍了python实现文本去重且不打乱原本顺序,需要的朋友可以参考下
    2016-01-01
  • Python如何处理大数据?3个技巧效率提升攻略(推荐)

    Python如何处理大数据?3个技巧效率提升攻略(推荐)

    这篇文章主要介绍了Python如何处理大数据?3个技巧效率提升攻略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Flask框架学习笔记之路由和反向路由详解【图文与实例】

    Flask框架学习笔记之路由和反向路由详解【图文与实例】

    这篇文章主要介绍了Flask框架学习笔记之路由和反向路由,结合图文与实例形式详细分析了flask框架中路由与反向路由相关概念、原理、用法与相关操作注意事项,需要的朋友可以参考下
    2019-08-08
  • 聊聊pytorch中Optimizer与optimizer.step()的用法

    聊聊pytorch中Optimizer与optimizer.step()的用法

    这篇文章主要介绍了pytorch中Optimizer与optimizer.step()的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python利用Streamlit构建一个简单的照片墙应用

    Python利用Streamlit构建一个简单的照片墙应用

    在现代 web 开发中,快速构建交互式应用是一项重要的技能,Streamlit 是一个强大的 Python 库,允许开发者以最小的代码量创建美观且功能丰富的 web 应用,今天,我们将通过分析一段简单的 Streamlit 代码,展示如何构建一个照片墙应用,需要的朋友可以参考下
    2025-04-04
  • python实现电脑操控安卓手机

    python实现电脑操控安卓手机

    网上虽然有很多教程,但是随着版本的更新总有各种各样的坑,本文以亲身踏坑经历介绍了电脑使用python操控安卓手机,从安装到使用方法,感兴趣的可以了解一下
    2021-05-05
  • pytorch中的dataset用法详解

    pytorch中的dataset用法详解

    这篇文章主要介绍了pytorch的dataset用法详解,当我们继承了一个 Dataset类之后,我们需要重写 len 方法,该方法提供了dataset的大小; getitem 方法, 该方法支持从 0 到 len(self)的索引,下面来看看附有代码的讲解吧,希望对你的学习或者工作有所帮助
    2022-01-01

最新评论