自动创建word文档的exe文件,自定义文件名、保存路径

目录

一、exe

二、使用方法

三、代码

四、Python打包exe


一、exe

百度网盘:
链接:https://pan.baidu.com/s/1dyCo_iVv7fb369BHbwGjHg 
提取码:2333

夸克网盘:
链接:https://pan.quark.cn/s/36b14a53cccd 

二、使用方法

1. 下载完成后双击文件。

2.  先选择保存路径,然后在空白区域输入文件名称,注意用顿号、分割文件名称,最后点击创建,弹出创建完成的窗口后即可在对应目录找到文档。

三、代码

import os
from docx import Document
import tkinter as tk
from tkinter import filedialog, messagebox, Label, Button, Text, Scrollbar, Frame

class DocxCreatorApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("Word 文档创建器")
        self.geometry("400x300")

        self.init_ui()

    def init_ui(self):
        # 目录选择按钮
        self.btn_select_folder = Button(self, text="选择保存目录", command=self.select_folder)
        self.btn_select_folder.pack(pady=10)

        # 显示选择的目录
        self.label_folder_path = Label(self, text="未选择目录")
        self.label_folder_path.pack()

        # 文件名输入提示
        self.label_input = Label(self, text="输入文件名(用顿号 、分隔多个文件, 注意不要带有\/:*?<>|以上字符)")
        self.label_input.pack()
        
        # 文件名输入区域 + 滚动条
        self.text_frame = Frame(self)
        self.text_frame.pack()

        self.text_file_names = Text(self.text_frame, height=10, width=50)
        self.scrollbar = Scrollbar(self.text_frame, command=self.text_file_names.yview)
        self.text_file_names.configure(yscrollcommand=self.scrollbar.set)

        self.text_file_names.pack(side=tk.LEFT, expand=True)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        # 创建文件按钮
        self.btn_create_files = Button(self, text="创建文件", command=self.create_files)
        self.btn_create_files.pack(pady=20)

        self.docx_path = ""

    def select_folder(self):
        folder_selected = filedialog.askdirectory()
        if folder_selected:
            self.docx_path = folder_selected
            self.label_folder_path.config(text=self.docx_path)

    def create_files(self):
        if not self.docx_path:
            messagebox.showerror("错误", "请先选择一个保存目录")
            return
        
        file_names_raw = self.text_file_names.get("1.0", tk.END).split('、')
        # 过滤并清理文件名
        file_names = [name.strip().replace('/', '_').replace('\\', '_').replace(':', '_').replace('*', '_').replace('?', '_').replace('<', '_').replace('>', '_').replace('|', '_') for name in file_names_raw if name.strip()]
        
        if not file_names:
            messagebox.showerror("错误", "请输入至少一个文件名")
            return
        
        for name in file_names:
            # 确保文件名非空且没有使用违规字符
            if name:
                doc = Document()
                filename = os.path.join(self.docx_path, name + ".docx")
                try:
                    doc.save(filename)
                except Exception as e:
                    messagebox.showerror("错误", f"文件 '{name}' 创建失败: {e}")
                    continue  # 处理下一个文件名
            
        messagebox.showinfo("完成", "所有文档已成功创建!")

if __name__ == "__main__":
    app = DocxCreatorApp()
    app.mainloop()

1.command=self.select_folder
  将一个函数 self.select_folder 分配给按钮 self.btn_select_folder。当用户点击这个按钮时,就会调用 self.select_folder 函数。 self.select_folder 函数使用 filedialog.askdirectory() 来打开一个文件夹选择对话框,让用户选择一个目录,并将选定的目录路径存储在 self.docx_path 变量中。

2. self.btn_select_folder.pack(pady=10)
  self.btn_select_folder.pack(pady=10) 是一个 Tkinter 中的方法调用,用于将按钮 self.btn_select_folder 放置在GUI界面上,并指定垂直方向上的外边距为 10 px。

3. self.text_frame = Frame(self) ;self.text_frame.pack()
  self.text_frame = Frame(self)创建一个名为 text_frame 的 Frame 组件容器,相当于html中的盒子,self.text_frame.pack()将其放置在应用程序中(或者说是GUI界面)。

4. 文本区域+滚动条
  self.text_file_names = Text(self.text_frame, height=10, width=50)创建了一个文本框, self.text_file_names,self.text_frame 是文本框所在的父容器(通常是一个 Frame)(文本框和滚动条设置为同一个父容器放在一起),height=10 指定了文本框的高度为 10 行,width=50 则指定了文本框的宽度为 50 个字符。
  self.scrollbar = Scrollbar(self.text_frame, command=self.text_file_names.yview)创建一个滚动条, self.text_frame 是滚动条所在的父容器(文本框和滚动条设置为同一个父容器放在一起),command=self.text_file_names.yview 表示滚动条与文本框的纵向滚动事件关联起来。当用户拖动滚动条时,会触发 self.text_file_names.yview 方法,从而使文本框内容相应地进行垂直滚动。
  self.text_file_names.configure(yscrollcommand=self.scrollbar.set)将滚动条与文本框进行关联,yscrollcommand 为 self.scrollbar.set,表示滚动条的位置变化将通过调用 self.scrollbar.set 方法来通知文本框进行滚动。
  self.text_file_names.pack(side=tk.LEFT, expand=True),文本框 self.text_file_names 将其放置在应用程序(或者说是GUI界面)中。side=tk.LEFT 指定了文本框放置在父容器的左侧,这意味着它会沿着父容器的左边缘排列。expand=True 表示允许文本框在水平方向上扩展以填充剩余空间。如果父容器的大小发生变化,文本框将根据需要水平扩展以填满可用空间。
  self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)。side=tk.RIGHT 指定了滚动条放置在父容器的右侧,因此它会沿着父容器的右边缘排列。fill=tk.Y 表示滚动条在垂直方向上填充整个可用空间。这使得滚动条在垂直方向上占据父容器中所有可用的高度空间,以便用户可以通过滚动条进行垂直滚动。

5. file_names_raw = self.text_file_names.get("1.0", tk.END).split('、')
  获取文本框 self.text_file_names 中的内容,并将其按照 '、' 分割成一个文件名列表。详细的说,self.text_file_names.get("1.0", tk.END) 会获取从文本框的第一行第一个字符("1.0")到最后一行最后一个字符(tk.END)的所有文本内容。这个返回的字符串包含了文本框中的所有文本。
接下来,.split('、') 将获取到的文本字符串按照 '、' 进行分割,得到一个文件名列表。就是说文本框中的文本会被按照 '、' 进行分隔,将每个文件名作为列表中的一个元素。

 

四、Python打包exe

pyinstaller --onefile --windowed --name "DocxCreator" DocxCreatorApp.py

将 "DocxCreator" 和 DocxCreatorApp.py 分别修改为你希望的exe名称和你的python文件名。

 

.版本 2 .局部变量 段, 段, , "0" .局部变量 表目录, 表目录, , "0" .局部变量 现行位置 .局部变量 段数 .局部变量 段内存地址, , , "0" .局部变量 段占用文件大小 .局部变量 代码入口地址 .局部变量 表的数量, 整数型 .局部变量 计次, 整数型 .局部变量 计次2, 整数型 .局部变量 代码段地址, 整数型 .局部变量 文件对齐度 .局部变量 DOS数据, 字节集 .局部变量 首选装载地址, 整数型 .局部变量 控制台程序, 逻辑型 现行位置 = 取字节集数据 (文件, #整数型, #MZ头长度 - 3) + 1 ' DOS数据 = 取字节集中间 (文件, #MZ头长度 + 1, 现行位置 - #MZ头长度 - 1) .如果真 (取字节集数据 (文件, #整数型, 现行位置) ≠ #PE署名) 返回 () .如果真结束 现行位置 = 现行位置 + 2 段数 = 取字节集数据 (文件, #短整数型, 现行位置) 重定义数组 (段, 假, 段数) 重定义数组 (段内存地址, 假, 段数) 现行位置 = 现行位置 + 32 代码入口地址 = 取字节集数据 (文件, #整数型, 现行位置) 代码段地址 = 取字节集数据 (文件, #整数型, 现行位置) 现行位置 = 现行位置 + 4 首选装载地址 = 取字节集数据 (文件, #整数型, 现行位置) 现行位置 = 现行位置 + 4 文件对齐度 = 取字节集数据 (文件, #整数型, 现行位置) 现行位置 = 现行位置 + 28 控制台程序 = 取字节集中间 (文件, 现行位置, 2) = { 3, 0 } 现行位置 = 现行位置 + 24 表的数量 = 取字节集数据 (文件, #整数型, 现行位置) 重定义数组 (表目录, 假, 表的数量) .计次循环首 (表的数量, 计次) 表目录 [计次].地址 = 取字节集数据 (文件, #整数型, 现行位置) 表目录 [计次].大小 = 取字节集数据 (文件, #整数型, 现行位置) .计次循环尾 () .计次循环首 (段数, 计次) ' 段 [计次].名称 = 取字节集中间 (文件, 现行位置, 8) 现行位置 = 现行位置 + 8 段 [计次].内存大小 = 取字节集数据 (文件, #整数型, 现行位置) 段内存地址 [计次] = 取字节集数据 (文件, #整数型, 现行位置) 段占用文件大小 = 取字节集数据 (文件, #整数型, 现行位置) 段 [计次].数据 = 字节集删尾空 (取字节集中间 (文件, 取字节集数据 (文件, #整数型, 现行位置) + 1, 段占用文件大小)) 现行位置 = 现行位置 + 12 段 [计次].属性 = 取字节集数据 (文件, #整数型, 现行位置) .计次循环尾 () .计次循环首 (表的数量, 计次) .变量循环首 (段数, 1, -1, 计次2) .如果真 (表目录 [计次].地址 ≥ 段内存地址 [计次2]) 表目录 [计次].段号 = 计次2 表目录 [计次].地址 = 表目录 [计次].地址 - 段内存地址 [计次2] 跳出循环 () .如果真结束 .变量循环尾 () .计次循环尾 () .计次循环首 (段数, 计次) .如果真 (段内存地址 [计次] = 代码段地址) 代码入口地址 = 代码入口地址 - 代码段地址 生成PE文件 (首选装载地址, 段, 计次, 代码入口地址, 文件对齐度, 表目录, DOS数据, 控制台程序) 跳出循环 () .如果真结束 .计次循环尾 ()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子不好真君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值