window 环境变量添加工具 python制作

文章正文
发布时间:2025-11-02 05:41

[Python] 纯文本查看 复制代码

import sys import os import winreg import tkinter as tk from tkinter import messagebox import subprocess import ctypes import re def hide_console(): """隐藏控制台窗口""" if sys.platform.startswith('win'): ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0) def notify_environment_change(): """通知系统环境变量已更改""" HWND_BROADCAST = 0xFFFF WM_SETTINGCHANGE = 0x1A SMTO_ABORTIFHUNG = 0x0002 result = ctypes.c_long() SendMessageTimeoutW = ctypes.windll.user32.SendMessageTimeoutW SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, "Environment", SMTO_ABORTIFHUNG, 5000, ctypes.byref(result)) def set_environment_variable(key_path, key_name, value): """设置环境变量""" try: with winreg.OpenKey(winreg.HKEY_CURRENT_USER if key_path == "user" else winreg.HKEY_LOCAL_MACHINE, r"Environment" if key_path == "user" else r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", 0, winreg.KEY_ALL_ACCESS) as key: winreg.SetValueEx(key, key_name, 0, winreg.REG_SZ, value) if key_path == "user": startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW subprocess.run(f'setx {key_name} "{value}"', startupinfo=startupinfo, shell=True) else: notify_environment_change() messagebox.showinfo("成功", f"环境变量 {key_name} 已成功添加,值为 {value}") except PermissionError: messagebox.showerror("错误", "权限不足,请以管理员身份运行此程序。") except Exception as e: messagebox.showerror("错误", f"添加环境变量时出错: {e}") def add_variable(): """添加环境变量的主函数""" choice = var.get() key_name = entry_key.get() value = entry_value.get() # 检查输入内容是否为空 if not key_name or not value: messagebox.showerror("错误", "环境变量名和值都不能为空,请重新输入。") return # 检查路径是否符合规则 pattern = r'^[C-Z]:\\(.*(\\|/)?|.*\.exe)$' if not re.match(pattern, value): messagebox.showerror("错误", "环境变量值必须以 C: 到 Z: 盘开头,并且以目录或 .exe 文件结尾,请重新输入。") return if choice == 1: set_environment_variable("user", key_name, value) elif choice == 2: set_environment_variable("system", key_name, value) else: messagebox.showerror("错误", "无效的选项,请选择用户环境变量或系统环境变量。") def limit_length(new_text, max_length): """限制输入框最大长度的函数""" return len(new_text) <= max_length # 隐藏控制台窗口 hide_console() # 创建主窗口 root = tk.Tk() root.title("环境变量添加工具") # 优化窗口尺寸,设置最小尺寸,让窗口根据内容自适应 root.minsize(288, 223) root.update_idletasks() # 获取窗口所需的宽度和高度 width = root.winfo_reqwidth() height = root.winfo_reqheight() # 获取屏幕的宽度和高度 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() # 计算窗口在屏幕上的居中位置 x = max(0, (screen_width - width) // 2) y = max(0, (screen_height - height) // 2) # 设置窗口的大小和位置,使其根据内容自适应并居中显示 root.geometry(f"{width}x{height}+{x}+{y}") # 禁止窗口放大和缩小 root.resizable(False, False) # 创建变量用于选择环境变量类型 var = tk.IntVar() # 设置默认值为 1,即默认选中用户环境变量 var.set(1) # 创建标签和输入框 # 设置字体为 2 号字体(假设这里近似为 12 号大小),颜色为红色 label_choice = tk.Label(root, text="请选择要添加的环境变量类型", fg="red", font=("Arial", 12)) label_choice.grid(row=0, column=0, columnspan=2, pady=10) radio_user = tk.Radiobutton(root, text="用户环境变量", variable=var, value=1) radio_user.grid(row=1, column=0, padx=10, pady=5) radio_system = tk.Radiobutton(root, text="系统环境变量", variable=var, value=2) radio_system.grid(row=1, column=1, padx=10, pady=5) label_key = tk.Label(root, text="请输入环境变量名:") label_key.grid(row=2, column=0, padx=10, pady=5) vcmd_key = (root.register(lambda new_text: limit_length(new_text, 50)), '%P') entry_key = tk.Entry(root, validate="key", validatecommand=vcmd_key) entry_key.grid(row=2, column=1, padx=10, pady=5) label_value = tk.Label(root, text="请输入环境变量值:") label_value.grid(row=3, column=0, padx=10, pady=5) vcmd_value = (root.register(lambda new_text: limit_length(new_text, 200)), '%P') entry_value = tk.Entry(root, validate="key", validatecommand=vcmd_value) entry_value.grid(row=3, column=1, padx=10, pady=5) # 创建添加按钮 button_add = tk.Button(root, text="添加", command=add_variable, bg="#007BFF", fg="white", font=("Arial", 12), activebackground="#0056b3", activeforeground="white", relief=tk.RAISED, bd=2, width=30, height=2) button_add.grid(row=4, column=0, columnspan=2, pady=20) # 鼠标悬停效果 def on_enter(event): button_add.config(bg="#0056b3") def on_leave(event): button_add.config(bg="#007BFF") button_add.bind("<Enter>", on_enter) button_add.bind("<Leave>", on_leave) # 运行主循环 root.mainloop() import sys import os import winreg import tkinter as tk from tkinter import messagebox import subprocess import ctypes import re def hide_console(): """隐藏控制台窗口""" if sys.platform.startswith('win'): ctypes.windll.user32.ShowWindow(ctypes.windll.kernel32.GetConsoleWindow(), 0) def notify_environment_change(): """通知系统环境变量已更改""" HWND_BROADCAST = 0xFFFF WM_SETTINGCHANGE = 0x1A SMTO_ABORTIFHUNG = 0x0002 result = ctypes.c_long() SendMessageTimeoutW = ctypes.windll.user32.SendMessageTimeoutW SendMessageTimeoutW(HWND_BROADCAST, WM_SETTINGCHANGE, 0, "Environment", SMTO_ABORTIFHUNG, 5000, ctypes.byref(result)) def set_environment_variable(key_path, key_name, value): """设置环境变量""" try: with winreg.OpenKey(winreg.HKEY_CURRENT_USER if key_path == "user" else winreg.HKEY_LOCAL_MACHINE, r"Environment" if key_path == "user" else r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", 0, winreg.KEY_ALL_ACCESS) as key: winreg.SetValueEx(key, key_name, 0, winreg.REG_SZ, value) if key_path == "user": startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW subprocess.run(f'setx {key_name} "{value}"', startupinfo=startupinfo, shell=True) else: notify_environment_change() messagebox.showinfo("成功", f"环境变量 {key_name} 已成功添加,值为 {value}") except PermissionError: messagebox.showerror("错误", "权限不足,请以管理员身份运行此程序。") except Exception as e: messagebox.showerror("错误", f"添加环境变量时出错: {e}") def add_variable(): """添加环境变量的主函数""" choice = var.get() key_name = entry_key.get() value = entry_value.get() # 检查输入内容是否为空 if not key_name or not value: messagebox.showerror("错误", "环境变量名和值都不能为空,请重新输入。") return # 检查路径是否符合规则 pattern = r'^[C-Z]:\\(.*(\\|/)?|.*\.exe)$' if not re.match(pattern, value): messagebox.showerror("错误", "环境变量值必须以 C: 到 Z: 盘开头,并且以目录或 .exe 文件结尾,请重新输入。") return if choice == 1: set_environment_variable("user", key_name, value) elif choice == 2: set_environment_variable("system", key_name, value) else: messagebox.showerror("错误", "无效的选项,请选择用户环境变量或系统环境变量。") def limit_length(new_text, max_length): """限制输入框最大长度的函数""" return len(new_text) <= max_length # 隐藏控制台窗口 hide_console() # 创建主窗口 root = tk.Tk() root.title("环境变量添加工具") # 优化窗口尺寸,设置最小尺寸,让窗口根据内容自适应 root.minsize(288, 223) root.update_idletasks() # 获取窗口所需的宽度和高度 width = root.winfo_reqwidth() height = root.winfo_reqheight() # 获取屏幕的宽度和高度 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() # 计算窗口在屏幕上的居中位置 x = max(0, (screen_width - width) // 2) y = max(0, (screen_height - height) // 2) # 设置窗口的大小和位置,使其根据内容自适应并居中显示 root.geometry(f"{width}x{height}+{x}+{y}") # 禁止窗口放大和缩小 root.resizable(False, False) # 创建变量用于选择环境变量类型 var = tk.IntVar() # 设置默认值为 1,即默认选中用户环境变量 var.set(1) # 创建标签和输入框 # 设置字体为 2 号字体(假设这里近似为 12 号大小),颜色为红色 label_choice = tk.Label(root, text="请选择要添加的环境变量类型", fg="red", font=("Arial", 12)) label_choice.grid(row=0, column=0, columnspan=2, pady=10) radio_user = tk.Radiobutton(root, text="用户环境变量", variable=var, value=1) radio_user.grid(row=1, column=0, padx=10, pady=5) radio_system = tk.Radiobutton(root, text="系统环境变量", variable=var, value=2) radio_system.grid(row=1, column=1, padx=10, pady=5) label_key = tk.Label(root, text="请输入环境变量名:") label_key.grid(row=2, column=0, padx=10, pady=5) vcmd_key = (root.register(lambda new_text: limit_length(new_text, 50)), '%P') entry_key = tk.Entry(root, validate="key", validatecommand=vcmd_key) entry_key.grid(row=2, column=1, padx=10, pady=5) label_value = tk.Label(root, text="请输入环境变量值:") label_value.grid(row=3, column=0, padx=10, pady=5) vcmd_value = (root.register(lambda new_text: limit_length(new_text, 200)), '%P') entry_value = tk.Entry(root, validate="key", validatecommand=vcmd_value) entry_value.grid(row=3, column=1, padx=10, pady=5) # 创建添加按钮 button_add = tk.Button(root, text="添加", command=add_variable, bg="#007BFF", fg="white", font=("Arial", 12), activebackground="#0056b3", activeforeground="white", relief=tk.RAISED, bd=2, width=30, height=2) button_add.grid(row=4, column=0, columnspan=2, pady=20) # 鼠标悬停效果 def on_enter(event): button_add.config(bg="#0056b3") def on_leave(event): button_add.config(bg="#007BFF") button_add.bind("<Enter>", on_enter) button_add.bind("<Leave>", on_leave) # 运行主循环 root.mainloop()