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

查看 31|回复 2
作者:lushuai   
代码如下:
[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) ", on_enter)
button_add.bind("", 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) ", on_enter)
button_add.bind("", on_leave)
# 运行主循环
root.mainloop()
   

环境变量, 窗口

hxy19710830   

# -*- coding: utf-8 -*-
"""
Windows环境变量管理工具
功能:添加用户/系统环境变量(带GUI界面)
作者:优化版
"""
import sys
import os
import winreg
import tkinter as tk
from tkinter import ttk, messagebox
import subprocess
import ctypes
import re
from typing import Optional, Tuple
class EnvVarManager:
    """环境变量管理核心类"""
   
    @staticmethod
    def hide_console() -> None:
        """隐藏控制台窗口"""
        if sys.platform.startswith('win'):
            ctypes.windll.user32.ShowWindow(
                ctypes.windll.kernel32.GetConsoleWindow(), 0
            )
   
    @staticmethod
    def notify_environment_change() -> None:
        """广播环境变量变更通知"""
        HWND_BROADCAST = 0xFFFF
        WM_SETTINGCHANGE = 0x1A
        SMTO_ABORTIFHUNG = 0x0002
        result = ctypes.c_long()
        ctypes.windll.user32.SendMessageTimeoutW(
            HWND_BROADCAST, WM_SETTINGCHANGE, 0,
            "Environment", SMTO_ABORTIFHUNG, 5000, ctypes.byref(result)
        )
   
    @staticmethod
    def validate_path(path: str) -> Tuple[bool, str]:
        """验证路径格式"""
        pattern = r'^([A-Za-z]:[\\/].*|%[^%]+%)([\\/].*)*$'
        if not re.match(pattern, path):
            return False, "路径必须以盘符(如C:\\)或环境变量(如%JAVA_HOME%)开头"
        return True, ""
   
    @classmethod
    def set_environment_variable(
        cls,
        key_path: str,
        key_name: str,
        value: str
    ) -> Tuple[bool, str]:
        """设置环境变量"""
        try:
            # 权限检查
            if key_path == "system" and ctypes.windll.shell32.IsUserAnAdmin() == 0:
                return False, "需要管理员权限修改系统环境变量"
            
            # 注册表操作
            root_key = winreg.HKEY_CURRENT_USER if key_path == "user" else winreg.HKEY_LOCAL_MACHINE
            sub_key = r"Environment" if key_path == "user" else \
                     r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
            
            with winreg.OpenKey(root_key, sub_key, 0, winreg.KEY_ALL_ACCESS) as key:
                winreg.SetValueEx(key, key_name, 0, winreg.REG_EXPAND_SZ if '%' in value else winreg.REG_SZ, value)
            
            # 用户变量使用setx确保立即生效
            if key_path == "user":
                startupinfo = subprocess.STARTUPINFO()
                startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
                subprocess.run(
                    f'setx {key_name} "{value}"',
                    startupinfo=startupinfo,
                    shell=True,
                    check=True
                )
            else:
                cls.notify_environment_change()
            
            return True, f"成功添加环境变量: {key_name}={value}"
        
        except PermissionError:
            return False, "权限不足,请以管理员身份运行"
        except subprocess.CalledProcessError:
            return False, "setx命令执行失败"
        except Exception as e:
            return False, f"操作失败: {str(e)}"
class EnvVarGUI:
    """GUI界面类"""
   
    def __init__(self):
        self.manager = EnvVarManager()
        self.setup_ui()
   
    def setup_ui(self) -> None:
        """初始化用户界面"""
        self.root = tk.Tk()
        self.root.title("环境变量管理工具 v2.0")
        
        # 窗口设置
        self.root.minsize(450, 300)
        self.center_window()
        self.root.resizable(False, False)
        
        # 样式配置
        self.setup_styles()
        
        # 控件布局
        self.create_widgets()
   
    def center_window(self) -> None:
        """窗口居中显示"""
        self.root.update_idletasks()
        width = self.root.winfo_reqwidth()
        height = self.root.winfo_reqheight()
        screen_width = self.root.winfo_screenwidth()
        screen_height = self.root.winfo_screenheight()
        x = max(0, (screen_width - width) // 2)
        y = max(0, (screen_height - height) // 2)
        self.root.geometry(f"{width}x{height}+{x}+{y}")
   
    def setup_styles(self) -> None:
        """配置界面样式"""
        style = ttk.Style()
        style.configure('TLabel', font=('Microsoft YaHei', 10))
        style.configure('TRadiobutton', font=('Microsoft YaHei', 10))
        style.configure('TButton', font=('Microsoft YaHei', 10))
   
    def create_widgets(self) -> None:
        """创建界面控件"""
        # 变量类型选择
        ttk.Label(self.root, text="环境变量类型:", style='TLabel').grid(
            row=0, column=0, padx=10, pady=10, sticky='w'
        )
        
        self.var_type = tk.IntVar(value=1)
        ttk.Radiobutton(
            self.root, text="用户变量", variable=self.var_type,
            value=1, style='TRadiobutton'
        ).grid(row=0, column=1, padx=5, pady=5, sticky='w')
        
        ttk.Radiobutton(
            self.root, text="系统变量", variable=self.var_type,
            value=2, style='TRadiobutton'
        ).grid(row=0, column=2, padx=5, pady=5, sticky='w')
        
        # 变量名输入
        ttk.Label(self.root, text="变量名称:", style='TLabel').grid(
            row=1, column=0, padx=10, pady=5, sticky='w'
        )
        
        self.entry_name = ttk.Entry(self.root, width=40)
        self.entry_name.grid(
            row=1, column=1, columnspan=2, padx=10, pady=5, sticky='we'
        )
        
        # 变量值输入
        ttk.Label(self.root, text="变量值:", style='TLabel').grid(
            row=2, column=0, padx=10, pady=5, sticky='w'
        )
        
        self.entry_value = ttk.Entry(self.root, width=40)
        self.entry_value.grid(
            row=2, column=1, columnspan=2, padx=10, pady=5, sticky='we'
        )
        
        # 操作按钮
        btn_frame = ttk.Frame(self.root)
        btn_frame.grid(row=3, column=0, columnspan=3, pady=15)
        
        ttk.Button(
            btn_frame, text="添加变量", command=self.add_variable,
            style='TButton'
        ).pack(side='left', padx=10)
        
        ttk.Button(
            btn_frame, text="清除输入", command=self.clear_inputs,
            style='TButton'
        ).pack(side='left', padx=10)
        
        # 状态栏
        self.status_var = tk.StringVar()
        self.status_var.set("就绪")
        ttk.Label(
            self.root, textvariable=self.status_var,
            relief='sunken', anchor='w'
        ).grid(row=4, column=0, columnspan=3, sticky='we', padx=10, pady=5)
   
    def add_variable(self) -> None:
        """添加环境变量"""
        var_name = self.entry_name.get().strip()
        var_value = self.entry_value.get().strip()
        
        # 输入验证
        if not var_name or not var_value:
            messagebox.showerror("错误", "变量名和值不能为空")
            return
        
        # 路径验证
        is_valid, msg = self.manager.validate_path(var_value)
        if not is_valid:
            messagebox.showerror("路径错误", msg)
            return
        
        # 设置变量
        var_type = "user" if self.var_type.get() == 1 else "system"
        success, result = self.manager.set_environment_variable(
            var_type, var_name, var_value
        )
        
        if success:
            messagebox.showinfo("成功", result)
            self.status_var.set(f"成功添加: {var_name}")
        else:
            messagebox.showerror("错误", result)
            self.status_var.set("操作失败")
   
    def clear_inputs(self) -> None:
        """清除输入内容"""
        self.entry_name.delete(0, tk.END)
        self.entry_value.delete(0, tk.END)
        self.status_var.set("输入已清除")
   
    def run(self) -> None:
        """运行应用程序"""
        self.manager.hide_console()
        self.root.mainloop()
if __name__ == "__main__":
    app = EnvVarGUI()
    app.run()
hxy19710830   

代码插入可以参考这个帖子
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn/thread-713042-1-1.html
(出处: 吾爱破解论坛)
您需要登录后才可以回帖 登录 | 立即注册

返回顶部