基于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对零售商品进行数据分析

    使用Python对零售商品进行数据分析

    这篇文章主要为大家介绍了使用Python对零售商品进行数据分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • python运行cmd命令10种方式并获得返回值的高级技巧

    python运行cmd命令10种方式并获得返回值的高级技巧

    这篇文章主要给大家介绍了关于python运行cmd命令10种方式并获得返回值的高级技巧,主要包括python脚本执行CMD命令并返回结果的例子使用实例、应用技巧,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • Python连接Spark的7种方法大全

    Python连接Spark的7种方法大全

    Apache Spark 是一个强大的分布式计算框架,广泛用于大规模数据处理,通过 PySpark,Python 开发者能够无缝接入 Spark 生态系统,本文给大家介绍了Python连接Spark的7种方法,从入门到生产级部署,需要的朋友可以参考下
    2025-11-11
  • DRF跨域后端解决之django-cors-headers的使用

    DRF跨域后端解决之django-cors-headers的使用

    这篇文章主要介绍了DRF跨域后端解决之django-cors-headers的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Python中bytes和str的区别与联系详解

    Python中bytes和str的区别与联系详解

    Python3最重要的新特性之一是对字符串和二进制数据流做了明确的区,下面这篇文章主要给大家介绍了关于Python中bytes和str区别与联系的相关资料,需要的朋友可以参考下
    2022-05-05
  • python使用 __init__初始化操作简单示例

    python使用 __init__初始化操作简单示例

    这篇文章主要介绍了python使用 __init__初始化操作,结合实例形式分析了Python面向对象程序设计中使用__init__进行初始化操作相关技巧与注意事项,需要的朋友可以参考下
    2019-09-09
  • django 实现celery动态设置周期任务执行时间

    django 实现celery动态设置周期任务执行时间

    今天小编就为大家分享一篇django 实现celery动态设置周期任务执行时间,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • Python OpenCV之常用滤波器使用详解

    Python OpenCV之常用滤波器使用详解

    OpenCV中常用的几种滤波器有:均值滤波器、中值滤波器、高斯滤波器、双边滤波器,本文将通过示例详细讲解这几种滤波器的使用,需要的可以参考一下
    2022-04-04
  • Python查询Mysql时返回字典结构的代码

    Python查询Mysql时返回字典结构的代码

    MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.DictCursor就行
    2012-06-06
  • Python3.5 Pandas模块之Series用法实例分析

    Python3.5 Pandas模块之Series用法实例分析

    这篇文章主要介绍了Python3.5 Pandas模块之Series用法,结合实例形式分析了Python3.5中Pandas模块的Series结构原理、创建、获取、运算等相关操作技巧与注意事项,需要的朋友可以参考下
    2019-04-04

最新评论