GitHub文档地址:
https://github.com/gao7025/auto_entry_md5.git

引言

利用tkinter构造一个图形界面的创建函数,主要实现了文件选择、MD5加密处理、结果预览和下载等功能。下面是主要涉及的功能模块:主框架、文件选择部分、MD5加密部分、结果预览部分、下载功能和状态栏等功能。

  1. 支持CSV、Excel和文本文件的上传
  2. 可以同时选择多个列进行MD5加密
  3. 加密过程在后台线程中进行,不会阻塞界面
  4. 显示加密结果的预览信息
  5. 将加密结果导出为Excel文件

1. 创建界面组件
    def create_widgets(self):# 创建主框架main_frame = ttk.Frame(self.root, padding="20")main_frame.pack(fill=tk.BOTH, expand=True)# 文件选择部分file_frame = ttk.LabelFrame(main_frame, text="文件选择", padding="10")file_frame.pack(fill=tk.X, pady=(0, 10))ttk.Label(file_frame, text="选择文件:").grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)self.file_path_var = tk.StringVar()ttk.Entry(file_frame, textvariable=self.file_path_var, width=50).grid(row=0, column=1, padx=5, pady=5)ttk.Button(file_frame, text="浏览...", command=self.browse_file).grid(row=0, column=2, padx=5, pady=5)ttk.Button(file_frame, text="上传文件", command=self.load_file).grid(row=0, column=3, padx=5, pady=5)# 进度条self.progress_var = tk.DoubleVar()self.progress_bar = ttk.Progressbar(file_frame, variable=self.progress_var, maximum=100, length=300)self.progress_bar.grid(row=1, column=0, columnspan=4, padx=5, pady=5, sticky=tk.W+tk.E)# MD5加密部分md5_frame = ttk.LabelFrame(main_frame, text="MD5加密处理", padding="10")md5_frame.pack(fill=tk.X, pady=(0, 10))ttk.Label(md5_frame, text="选择要加密的列:").grid(row=0, column=0, padx=5, pady=5, sticky=tk.W)# 创建一个带滚动条的列表框用于多选列listbox_frame = ttk.Frame(md5_frame)listbox_frame.grid(row=0, column=1, padx=5, pady=5, sticky=tk.W+tk.E)self.columns_listbox = tk.Listbox(listbox_frame, selectmode=tk.MULTIPLE, width=30, height=5)self.columns_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)scrollbar = ttk.Scrollbar(listbox_frame, orient=tk.VERTICAL, command=self.columns_listbox.yview)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)self.columns_listbox.config(yscrollcommand=scrollbar.set)self.encrypt_btn = ttk.Button(md5_frame, text="加密所选列", command=self.encrypt_columns, state=tk.DISABLED)self.encrypt_btn.grid(row=0, column=2, padx=5, pady=5)# 结果预览部分results_frame = ttk.LabelFrame(main_frame, text="结果预览", padding="10")results_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 10))# 创建一个带滚动条的文本区域text_frame = ttk.Frame(results_frame)text_frame.pack(fill=tk.BOTH, expand=True)self.result_text = tk.Text(text_frame, wrap=tk.WORD, height=10)self.result_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)scrollbar = ttk.Scrollbar(text_frame, command=self.result_text.yview)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)self.result_text.config(yscrollcommand=scrollbar.set)# 下载按钮self.download_btn = ttk.Button(main_frame, text="下载加密结果", command=self.download_results, state=tk.DISABLED)self.download_btn.pack(pady=10)# 状态栏self.status_var = tk.StringVar()self.status_var.set("就绪")status_bar = ttk.Label(self.root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)status_bar.pack(side=tk.BOTTOM, fill=tk.X)
2. 打开文件浏览器选择文件,加载并显示文件内容
    def browse_file(self):file_path = filedialog.askopenfilename(filetypes=[("CSV文件", "*.csv"), ("Excel文件", "*.xlsx;*.xls"), ("文本文件", "*.txt"),("所有文件", "*.*")])if file_path:self.file_path_var.set(file_path)self.file_path = file_pathdef load_file(self):if not self.file_path:messagebox.showerror("错误", "请先选择一个文件")return# 清空结果文本区域和列表框self.result_text.delete(1.0, tk.END)self.columns_listbox.delete(0, tk.END)self.encrypted_data = None# 更新状态栏和启用进度条self.status_var.set("正在加载文件...")self.progress_var.set(0)self.progress_bar.start()# 在单独的线程中执行加载,避免界面卡顿load_thread = threading.Thread(target=self._perform_load)load_thread.daemon = Trueload_thread.start()def _perform_load(self):try:# 读取文件file_ext = os.path.splitext(self.file_path)[1].lower()if file_ext == '.csv':self.data = pd.read_csv(self.file_path)elif file_ext in ['.xlsx', '.xls']:self.data = pd.read_excel(self.file_path)elif file_ext == '.txt':# 尝试检测分隔符with open(self.file_path, 'r') as f:first_line = f.readline()if '\t' in first_line:self.data = pd.read_csv(self.file_path, sep='\t')elif ',' in first_line:self.data = pd.read_csv(self.file_path, sep=',')else:self.data = pd.read_csv(self.file_path, sep=None, engine='python')else:# 尝试用 pandas 读取其他格式try:self.data = pd.read_csv(self.file_path)except Exception as e:self.update_ui(lambda: messagebox.showerror("错误", f"不支持的文件格式: {e}"))self.update_ui(lambda: self.status_var.set("就绪"))self.update_ui(lambda: self.progress_bar.stop())return# 更新进度self.update_ui(lambda: self.progress_var.set(50))self.update_ui(lambda: self.status_var.set("正在准备预览..."))# 更新列选择列表框self.update_ui(self.update_columns_listbox)# 显示数据预览self.update_ui(self.display_data_preview)# 启用加密按钮self.update_ui(lambda: self.encrypt_btn.config(state=tk.NORMAL))# 完成self.update_ui(lambda: self.progress_var.set(100))self.update_ui(lambda: self.progress_bar.stop())self.update_ui(lambda: self.status_var.set("文件加载完成"))except Exception as e:# 显示错误信息并记录日志error_msg = f"加载文件时出错: {str(e)}"self.update_ui(lambda: messagebox.showerror("错误", error_msg))self.update_ui(lambda: self.progress_bar.stop())self.update_ui(lambda: self.status_var.set("加载失败"))log_error(type(e), e, e.__traceback__)
3.对选中的列进行MD5加密
    def encrypt_columns(self):if self.data is None or self.data.empty:messagebox.showerror("错误", "没有数据可加密")return# 获取所有选中的列selected_indices = self.columns_listbox.curselection()if not selected_indices:messagebox.showerror("错误", "请选择至少一个列进行加密")return# 提取选中的列名(去除类型标记)selected_columns = []for i in selected_indices:col_text = self.columns_listbox.get(i)# 如果列名包含类型标记,则提取原始列名if '(' in col_text and ')' in col_text:col_name = col_text.split('(')[0].strip()else:col_name = col_textselected_columns.append(col_name)# 检查选中的列是否存在于数据中invalid_cols = [col for col in selected_columns if col not in self.data.columns]if invalid_cols:messagebox.showerror("错误", f"选中的列不存在: {', '.join(invalid_cols)}")return# 更新状态栏self.status_var.set("正在加密数据...")self.progress_var.set(0)self.progress_bar.start()# 在单独的线程中执行加密,避免界面卡顿encryption_thread = threading.Thread(target=self._perform_encryption, args=(selected_columns,))encryption_thread.daemon = Trueencryption_thread.start()def _perform_encryption(self, selected_columns):try:# 创建数据副本self.encrypted_data = self.data.copy()# 对每列进行加密total_cols = len(selected_columns)for i, col in enumerate(selected_columns):# 更新进度progress = (i / total_cols) * 100self.update_ui(lambda p=progress: self.progress_var.set(p))# 创建新列名new_col = f"{col}_md5"# 对每一行进行MD5加密# 先将列转换为字符串类型self.encrypted_data[new_col] = self.data[col].astype(str).apply(lambda x: self._md5_encrypt(x) if pd.notna(x) else x)# 显示加密结果预览self.update_ui(self.display_encrypted_preview)# 启用下载按钮self.update_ui(lambda: self.download_btn.config(state=tk.NORMAL))# 完成self.update_ui(lambda: self.progress_var.set(100))self.update_ui(lambda: self.progress_bar.stop())self.update_ui(lambda: self.status_var.set("加密完成"))messagebox.showinfo("成功", f"已对选中的 {total_cols} 列进行MD5加密")except Exception as e:error_msg = f"加密过程中出错: {str(e)}"self.update_ui(lambda: messagebox.showerror("错误", error_msg))self.update_ui(lambda: self.progress_bar.stop())self.update_ui(lambda: self.status_var.set("加密失败"))log_error(type(e), e, e.__traceback__)def _md5_encrypt(self, text):return hashlib.md5(text.encode('utf-8')).hexdigest()
4.通过pyinstaller函数对文件进行exe打包
pyinstaller -w --onedir --hidden-import pandas --hidden-import openpyxl md5_encryption_tool.py

参数说明:

-w 或 --windowed:不显示命令行窗口(适合 GUI 应用)
-F 或 --onefile:打包成单个可执行的exe文件
–onedir 打包成包含所有依赖的文件夹(而不是单个exe文件)
–hidden-import:指定需要包含的隐藏依赖

在这里插入图片描述

结果展示

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/84047.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/84047.shtml
英文地址,请注明出处:http://en.pswp.cn/web/84047.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ICEM CFD网格生成 | 基本概念与界面工具

基本概念◆ 名称定义 网格:网格是空间离散的单元,用于如下数值仿真 结构 流体 电磁 其他 单元 0D – 节点单元 质量点 约束,加载位置 1D –线单元 Bars, beams, rods, springs 2D 网格边界 2D – 表面/壳单元 - 四边形 - 三角…

简化您的工作流程:在 Azure 中构建高效的逻辑应用程序

简介 在当今的数字化环境中,自动化工作流程和服务集成对于追求效率和敏捷性的企业至关重要。Azure Logic Apps 使开发人员和 IT 专业人员能够创建集成应用、数据、服务和系统的自动化工作流程。在本文中,我们将逐步讲解使用 Azure 门户创建 Logic Apps 的过程,并通过演示来说…

AI 技术落地实战:开发流程优化、行业场景重塑与前沿应用洞察

在人工智能技术如火如荼发展的当下,AI 工具、大模型以及它们在各行业的应用,正以前所未有的态势重塑着开发者的工作模式和各领域的发展格局。从智能编码助手让编程变得高效便捷,到自动化测试平台提升软件质量,从大模型在垂直行业的…

文本生成AI+图像识别:电商详情页信息提取实战

行业问题:传统采集难以应对“图文视频化”的电商信息 在电商平台不断“视频化”的趋势下,传统的网页采集手段正逐渐失效。以抖音为例,商品信息已不仅限于图文详情,而是通过短视频、图像混排、语音解说等形式呈现。商品的名称、优…

linux权限基础

权限的概念 linux中,权限是用于控制【用户】对 【文件】进行操作控制的工具。用户权限文件权限 用户权限 用户 用户组:具有相同特性的用户的集合体。 文件权限 linux中,一切皆文件,包括普通文件,目录,文件…

让C++处理JSON类型配置文件更轻松-Hjson-cpp详解

让C处理JSON类型配置文件更轻松-Hjson-cpp详解 一、Hjson-Cpp简介Hjson-Cpp简介核心特性安装与集成基本用法示例常用API说明与JSON互转错误处理性能建议高级特性1. 类型安全访问2. 文件操作3. 自定义解析规则 二、使用教程下载使用 一、Hjson-Cpp简介 Hjson-Cpp简介 Hjson-Cp…

单例模式的好处

为什么要使用单例模式 1.资源管理: 唯一性:某些资源在整个应用程序中只需要一个实例,例如日志记录器、配置管理器、数据库连接池等。单例模式可以确保这些资源的唯一性,避免重复创建和管理。 全局访问:单例模式提供了…

LangChain 结构化输出指南

LangChain 结构化输出指南 概述 对于许多应用程序(如聊天机器人),模型需要直接用自然语言回应用户。然而,在某些场景下,我们需要模型以结构化格式输出。例如,我们可能希望将模型输出存储在数据库中&#…

探究webView与html的通讯

最近出来个新需求: 需求描述: 将uniapp的代码打包成一个app,并实现原本的功能。 原uniapp是一个H5项目,主要的步骤流程是上传用户的身份证进行二要素认证,成功后再进行三方活体认证,然后三方回跳到项目中的…

高级定时器TIM1、TIM8

高级定时器在通用定时器的基础上增加了一些功能,如:重复计数器、带死区控制的互补输出通道、断路输入等。 捕获/比较通道的输出部分(通道1至3) 捕获/比较通道的输出部分(通道4) ①重复计数器RCR 基本和通用定时器发生溢出时,会直接生成更新时…

搭建简易采购系统:从需求分析到供应商数据库设计

一、需求分析框架(4大核心模块) 关键需求清单: 需求提报(含审批流) 供应商准入与评估 比价与订单生成 基础报表功能 二、技术选型方案 组件推荐方案替代方案前端框架Vue.js ElementUIReact Ant Design后端语言P…

基于LSTM-GARCH混合模型的“获利了结”量化解析:黄金单日1.27%跌幅的技术性归因

摘要:本文通过多维度量化指标、结合地缘风险溢价因子、货币政策预期指数及贸易摩擦不确定性指数,构建动态情景分析框架。 一、黄金价格技术面解析 周一(6月16日)现货黄金呈现"冲高回落-获利了结"典型特征,日…

【AI】Spring AI Alibaba 的介绍

目录 一、Spring AI Alibaba 的介绍 1.1 什么是 Spring AI Alibaba? 1.2 Spring AI 项目简介 二、核心概念 2.1 模型 2.2 提示(Prompt) 2.3 提示词模板(Prompt Template) 2.4 嵌入(Embedding&#x…

从main()函数的执行发散开来

大多数程序员的第一行代码可能都是从输出“Hello&#xff0c;World!开始的吧。如果请你写一个c程序&#xff0c;在屏幕上打印“Hello&#xff0c;World!”&#xff0c;下面的代码对拥有扎实编程基本功的你而言肯定so easy&#xff1a; #include <stdio.h>int main() {pr…

(16)java+ selenium->自动化测试-元素定位之By xpath下篇

1.简介 老规矩,我们还是接着前面两篇的Xpath 5.自动测试实战 以百度首页为例,将xpath的各种定位方法一一讲解和分享一下。 5.1大致步骤 1.访问百度首页。 2.通过xpath定位到元素,点击一下。 5.2模糊定位starts-with关键字 有一种特殊的情况:页面元素的属性值会被动态…

45-Oracle 索引的新建与重建

小伙们日常里有没有被业务和BOSS要求新建索引或是重建索引&#xff1f;他们都想着既快又稳&#xff0c;那么索引在在Oracle上如何实现、新建、重建。原则是什么&#xff1a; 1、新建索引&#xff0c;查询是否高频且慢&#xff0c;索引列是否高选择性&#xff0c;新增索引对写负…

使用 Rust Clippy 的详细方案

使用 Rust Clippy 的详细方案 Rust Clippy 是一个强大的静态分析工具&#xff0c;帮助开发者识别代码中的潜在问题并改善代码质量。以下是如何充分利用 Clippy 的方法&#xff1a; 安装 Clippy 确保 Rust 工具链已安装。通过以下命令安装 Clippy&#xff1a; rustup compon…

21.什么是JSBridge(1)

1.Native与H5交互的常用交互机制&#xff0c;主流选择是jsbridge 2.jsbridge是什么&#xff1f; JSBridge 是 Android 官方 WebView 提供的 addJavascriptInterface() 能力 项目方&#xff08;或三方库&#xff09;封装的桥梁通信协议。 底层机制由 Android 官方 WebView 提…

什么是Flink

Apache Flink&#xff1a;流批一体的大数据处理引擎 什么是Apache Flink&#xff1f; Apache Flink是一个开源的分布式流处理框架&#xff0c;最初由柏林工业大学开发&#xff0c;后成为Apache软件基金会的顶级项目。它能够以高吞吐、低延迟的方式处理无界数据流(流处理)和有…

区块链+智能合约如何解决上门按摩行业的信任问题?——App开发案例

你是不是觉得上门按摩市场已经人满为患&#xff1f;担心自己入局太晚或者缺乏行业经验&#xff1f;一组真实数据可能会让你改变看法&#xff1a;全国按摩服务需求正以月均8%的速度迅猛增长&#xff0c;但专业技师的供给量仅能跟上5%的增幅&#xff01;这意味着每个月都有相当于…