python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python tkinter实现PPT文本提取

基于Python和Tkinter实现一个PPT文本提取工具

作者:温轻舟

这篇文章主要介绍了基于tkinter和python-pptx库的PPT文本提取工具,支持将提取的文本保存为TXT或Word文档,并提供了进度显示和错误处理功能,需要的朋友可以参考下

一:效果展示:

本项目是基于 tkinter 图形界面的 PPT 文本提取工具,主要功能是从 PPT文件中提取所有文本内容,并支持将提取的文本保存为 .txt 格式Word 文档(.docx)

二:功能描述:

1. 核心功能:

(1)PPT 文件选择

(2)保存路径与格式设置

用户可自定义保存路径(通过文件夹选择)

支持两种保存格式:

TXT 文件:纯文本格式,每段文本占一行

Word 文档:通过 python-docx 库生成 .docx 文件,保留段落结构

(3)文本提取与进度显示

(4)错误处理与反馈

2. 技术实现:

(1)依赖库

(2)代码结构

三:完整代码:

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

您可能感兴趣的文章:
阅读全文