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

作者:

文章目录
  • 本项目是基于 tkinter 图形界面的 PPT 文本提取工具,主要功能是从 PPT文件中提取所有文本内容,并支持将提取的文本保存为 .txt 格式 或 Word 文档(.docx)
  • 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(“600×400″) # 初始化变量 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. 核心功能:
        • (1)PPT 文件选择
        • (2)保存路径与格式设置
        • (3)文本提取与进度显示
        • (4)错误处理与反馈
      • 2. 技术实现:
        • (1)依赖库
        • (2)代码结构
    • 三:完整代码:
      • 四:代码分析
        • 1. 导入模块
          • 2. 主应用类定义
            • 3. 初始化变量
              • 4. 创建UI界面
                • 5. 浏览PPT文件

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

                • 用户可以通过界面浏览并选择本地的PPT( .pptx )文件
                • 默认将保存路径设置为与 PPT 文件同目录下的 提取的文本 文件夹(自动创建)

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

                支持两种保存格式:

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

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

                • 遍历 PPT 的每一页幻灯片,提取所有 PPT 中的文本框内容
                • 实时更新进度条,显示当前处理的幻灯片进度
                • 若 PPT 中无文本,提示用户 “ 未提取到任何文本 ”

                • 捕获异常(如文件损坏、权限问题等),通过弹窗显示错误信息
                • 成功提取后,弹出提示框显示保存路径

                • tkinter:构建图形界面(文件对话框、按钮、进度条等)
                • python-pptx:读取PPT(.pptx) 文件并提取文本
                • python-docx:生成 Word 文档(仅在保存为 .docx 时使用)
                • os:处理文件路径(如创建目录,拼接路径)

                • 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()
                

                # 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
                

                # 定义主应用类 PPTTextExtractorApp
                class PPTTextExtractorApp:
                    def __init__(self, root):
                        # 初始化方法设置窗口标题和大小(600x400像素)
                        self.root = root
                        self.root.title("PPT 文本提取工具")
                        self.root.geometry("600x400")
                

                # 初始化变量,创建三个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")  
                

                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)
                

                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制作一个PPT文本提取工具
                • 使用Python快速提取PPT中的文本内容的代码示例
                • Python读取pdf、word、excel、ppt、csv和txt文件提取所有文本
                • Python实现提取或替换PPT中文本与图片的示例代码

                站内搜索