自动创建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文件名。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/446135.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序(7)——非递归快排

前面我们已经写了快排用递归的方法实现&#xff0c;在数据量大的时候&#xff0c;有可能会栈溢出。这里我们尝试一下改为非递归。 区分&#xff1a; 数据结构的栈——利用的是内存中的堆空间内存的栈——利用就是内存中的栈空间——函数创建函数栈帧堆的空间是远远大于栈的空…

突破编程_前端_JS编程实例(目录导航)

1 开发目标 目录导航组件旨在提供一个滚动目录导航功能&#xff0c;使得用户可以方便地通过点击目录条目快速定位到对应的内容标题位置&#xff0c;同时也能够随着滚动条的移动动态显示当前位置在目录中的位置&#xff1a; 2 详细需求 2.1 标题提取与目录生成 组件需要能够自…

Transformer之多角度解读

Transformer 文章目录 Transformer  &#x1f449;引言&#x1f48e; 一、 自注意力机制 &#xff1a; 主要用于 长距离依赖捕捉和转换序列二、 Encoder&#xff1a;2.1 多头注意力机制&#xff1a;2.2 残差连接&#xff1a; 三、 Decoder&#xff1a;3.1 Decoder 多头注意力…

SMART PLC自适应低通滤波器(收放卷线速度滤波)

一阶低通滤波器更多内容请参考信号处理专栏相关文章,常用链接如下: 1、SMART PLC 低通滤波器和模拟量采集应用 https://rxxw-control.blog.csdn.net/article/details/136595982https://rxxw-control.blog.csdn.net/article/details/1365959822、SMART PLC双线性变换和后向差…

腾讯云服务器99元一年购买链接来了,续费也是99元

良心腾讯云推出99元一年服务器&#xff0c;新用户和老用户均可以购买&#xff0c;续费不涨价&#xff0c;续费也是99元&#xff0c;配置为轻量2核2G4M、50GB SSD盘、300GB月流量、4M带宽&#xff1a;优惠价格99元一年&#xff0c;续费99元&#xff0c;官方活动页面 txybk.com/g…

【STM32】STM32F4中USART的使用方法和Printf的重定义(基于CubeMX和Keil)

文章目录 一、前言二、STM32CubeMX生成代码2.1 选择芯片2.2 配置相关模式2.3 生成代码 三、Keil重定义Printf3.1 勾选“UseMicroLIB”3.2 添加头文件和修改fputc和fgetc 四、测试Printf的效果4.1 字符串测试4.2 格式化输出测试 五、存在问题的解决方法5.1 检查串口号是否一致5.…

由于找不到vcruntime140.dll无法继续执行的多种解决方法

最近&#xff0c;我在安装Adobe Premiere Pro&#xff08;以下简称PR&#xff09;时遇到了一个问题&#xff0c;即无法找到vcruntime140.dll文件。这可能导致某些应用程序无法正常启动或运行&#xff0c;因为vcruntime140.dll是许多基于Microsoft Visual C编译的应用程序所必需…

【中医】康复科治疗与中医养生(针灸、理疗、足浴)

程序员生活指南之 【中医】康复治疗与中医养生&#xff08;针灸、理疗、足浴&#xff09; 文章目录 1、康复科室2、中医与养生3、中医康复技术 1、康复科室 什么是康复科&#xff1f; 大部分医院都有康复科&#xff0c;但很多人都不知其具体是干什么的。其实&#xff0c;康复…

考研常识 | 专业硕士与学术硕士的11个区别

专业硕士与学术硕士的11个区别 对于考研学子而言&#xff0c;了解专业学位与学术学位的区别&#xff0c;是报考的第一步。学术学位研究生一般都是全日制的&#xff0c;而专业学位研究生的学习方式还分为即全日制与非全日制两种。这篇文章将带大家认识全日制专业学位与全日制学术…

LCR 131. 砍竹子 I

解题思路&#xff1a;&#xff08;与砍竹子II的区别是&#xff0c;这里的竹子长度数量级较小&#xff09; 数学推导或贪心 切分规则&#xff1a; 等长&#xff0c;且尽量为3 b0时&#xff0c;pow(3,a) b1时&#xff0c;pow(3,a-1)*4 少一段3&#xff0c;并入b生成一…

【数据结构】Map的常用方法

文章目录 一、搜索1.概念 二、Map的使用1.概念&#xff1a;2.Map的常用方法&#xff1a;1.V put(K Key ,V Value )2.V get(Object key)3.V getOrDefault(Object key, V defaultValue)4.V remove(Object key)5.Set<K> keySet()6.Collection<V> values()7.Set<Map…

连锁门店终端如何高效IT运维?向日葵助力服装行业数字化升级

服装行业作为典型的传统行业&#xff0c;因供应逐渐饱和、产能相对过剩以及消费结构升级&#xff0c;其销售端的数字化转型需求是最为迫切的。 为此&#xff0c;某知名时装品牌紧抓数字化转型机遇&#xff0c;在2016年起就开始了数字化变革&#xff0c;并在两年多的时间里完成…

配置与管理DNS服务器

配置与管理DNS服务器 **1&#xff0c;什么是DNS&#xff1f;**负责将域名转换成实际想对应的ip地址&#xff0c;这个过程交域名解析。 **2&#xff0c;域名解析的方法&#xff1a;**分布式&#xff0c;层次结构的数据库系统。根域&#xff0c;顶级域&#xff0c;二级域&#…

MyBatis是纸老虎吗?(二)

从二月二十六号开始&#xff0c;我就要求自己出一期与MyBatis有关的文章&#xff0c;直到三月三号那天才发表第一篇文章。这速度&#xff0c;这质量&#xff0c;着实堪忧。经过这件事&#xff0c;我也深刻认识到自己性格上的缺陷——懒惰。为了克服这个坏毛病&#xff0c;我决定…

使用Julia语言和R语言实现K-均值

K-均值算法基础 K-均值聚类算法属于一种无监督学习的方法&#xff0c;通过迭代的方式将数据划分为K个不重叠的子集&#xff08;簇&#xff09;&#xff0c;每个子集由其内部数据点的平均值来表示。计算方法大体如下&#xff1a; 1.初始化簇中心 选择K个数据点作为初始的簇中心…

LLM RAG系统中消除数据幻觉的几个绝招-OPENAI公司内称的“大招”

前言-什么是数据幻觉&#xff1f;它到底有什么危害呢 我们直接来举例&#xff1a; 我是金银花一区的&#xff0c;附近有什么小学&#xff1f; 此时RAG带出如下信息&#xff1a; 金银花小区一区、二区、三区附近教育资源有&#xff1a;银树大学、建设小学金银花校区、金树高…

IMX8MM -- Yocto构建遇见的错误及解决方法:

IMX8MM Yocto构建遇见的错误及解决方法&#xff1a; 1 bison-3.0.4 error2 Opencv BB_NO_NETWORK Error &#xff1a;3 Yocto构建时出现U-boot 问题4 Yocto构建时出现Linux kernel编译问题5 wayland-native6 cross-localedef-native7 wayland-protocols8 mesa 硬件&#xff1a;…

React Navite环境搭建

React Navite官网地址 React Native 中文网 使用React来编写原生应用的框架 创建React Navite项目命令&#xff08;目录必须是英文&#xff09; npx react-nativelatest init AwesomeProject 如果你是想把 React Native 集成到现有的原生项目中&#xff0c;则步骤完全不同…

多项式回归算法模拟

import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures# 生成随机数作为x变量&#xff0c;范围在-5到5之间&#xff0c;共500个样本 x np.random.uniform(-5, 5, siz…

Java开发从入门到精通(一):Java的进阶语法知识

Java大数据开发和安全开发 Java的方法1.1 方法是什么1.1.1 方法的定义1.1.2 方法如何执行?1.1.3 方法定义时注意点1.1.4 使用方法的好处是? 1.2 方法的多种形式1.2.1 无参数 无返回值1.2.2 有参数 无返回值 1.3 方法使用时的常见问题1.4 方法的设计案例1.4.1 计算1-n的和1.4.…