跳转至

WinTools Windows工具模块

专为Windows系统设计的工具集合,提供窗口管理、文件编译、安装包制作等功能

📋 目录

✨ 功能特性

  • 🪟 窗口管理: 设置窗口透明度、查找窗口句柄
  • 🔧 文件编译: Python文件编译为PYD、C++编译
  • 📦 安装包制作: NSIS安装包制作、自动安装脚本
  • 🐍 Python管理: 自动安装Python、包管理
  • 💬 消息框: 系统消息框、用户交互
  • 🎨 界面美化: 任务栏透明、窗口特效
  • 系统工具: 系统信息、进程管理

🚀 快速开始

基本使用

from sindre.win_tools import tools, taskbar

# 设置窗口透明度
taskbar.set_windows_alpha(128, "Shell_TrayWnd")

# 编译Python文件
tools.py2pyd(r"C:\project\src", clear_py=False)

# 显示消息框
tools.show_message("操作完成", "任务已成功执行")

安装包制作

from sindre.win_tools import tools

# 制作NSIS安装包
tools.exe2nsis(
    work_dir=r"C:\project",
    files_to_compress=[
        r"C:\project\app.exe",
        r"C:\project\config.ini",
        r"C:\project\data\"
    ],
    exe_name="MyApp.exe"
)

🔧 核心功能

文件编译函数

def py2pyd(source_path: str, clear_py: bool = False):
    """
    将目录下所有py文件编译成pyd文件

    Args:
        source_path: 源码目录
        clear_py: 是否编译后清除py文件,注意备份
    """

def pip_install(package_name: str = "", target_dir: str = "", requirements_path: str = ""):
    """
    模拟pip安装

    Args:
        package_name: 包名
        target_dir: 安装目录,为空则自动安装到当前环境下
        requirements_path: requirements.txt路径
    """

def python_installer(install_dir: str, version: str = '3.9.6'):
    """
    自动安装Python

    Args:
        install_dir: 安装目录
        version: Python版本
    """

def exe2nsis(work_dir: str, files_to_compress: list, exe_name: str, 
            appname: str = "AI", version: str = "1.0.0.0", 
            author: str = "SindreYang", license: str = "", icon_old: str = ""):
    """
    制作NSIS安装包

    Args:
        work_dir: 工作目录
        files_to_compress: 要压缩的文件列表
        exe_name: 生成的exe名称
        appname: 应用名称
        version: 版本号
        author: 作者
        license: 许可证
        icon_old: 图标路径
    """

窗口管理函数

def set_windows_alpha(alpha: int = 255, class_name: str = "Shell_TrayWnd"):
    """
    通过查找class_name,强制用于设置任务栏透明程度

    Args:
        alpha: 透明度 (0--完全透明,255--完全不透明)
        class_name: 窗口类名
    """

def get_windows_child(hWnd):
    """
    获取窗口的所有子窗口

    Args:
        hWnd: 窗口句柄

    Returns:
        list: 子窗口句柄列表
    """

def HEXtoRGBAint(HEX: str):
    """
    将HEX颜色转换为RGBA整数

    Args:
        HEX: 十六进制颜色字符串

    Returns:
        int: RGBA整数值
    """

系统工具函数

def is_service_exists(service_name: str) -> bool:
    """
    检查Windows服务是否存在

    Args:
        service_name: 服务名称

    Returns:
        bool: 服务是否存在
    """

def check_port(port: int) -> bool:
    """
    检查端口是否被占用

    Args:
        port: 端口号

    Returns:
        bool: 端口是否被占用
    """

def kill_process_using_port(server_port: int) -> bool:
    """
    杀死占用指定端口的进程

    Args:
        server_port: 端口号

    Returns:
        bool: 是否成功杀死进程
    """

def download_url_file(url: str, package_path: str = "test.zip") -> bool:
    """
    下载URL文件

    Args:
        url: 下载URL
        package_path: 保存路径

    Returns:
        bool: 下载是否成功
    """

def zip_extract(zip_path: str, install_dir: str) -> bool:
    """
    解压ZIP文件

    Args:
        zip_path: ZIP文件路径
        install_dir: 解压目录

    Returns:
        bool: 解压是否成功
    """

📖 使用指南

1. 窗口管理

设置窗口透明度

from sindre.win_tools import taskbar

# 设置任务栏透明度
taskbar.set_windows_alpha(255, "Shell_TrayWnd")  # 完全不透明
taskbar.set_windows_alpha(128, "Shell_TrayWnd")  # 半透明
taskbar.set_windows_alpha(0, "Shell_TrayWnd")    # 完全透明

# 设置其他窗口透明度
taskbar.set_windows_alpha(200, "Notepad")        # 记事本
taskbar.set_windows_alpha(150, "Calculator")     # 计算器

# 批量设置窗口透明度
windows = ["Notepad", "Calculator", "Paint"]
for window in windows:
    try:
        taskbar.set_windows_alpha(180, window)
        print(f"设置 {window} 透明度成功")
    except Exception as e:
        print(f"设置 {window} 透明度失败: {e}")

查找和管理窗口

from sindre.win_tools import taskbar
import win32gui

# 查找窗口句柄
notepad_handle = win32gui.FindWindow("Notepad", None)
if notepad_handle:
    print(f"记事本窗口句柄: {notepad_handle}")

    # 获取子窗口
    child_windows = taskbar.get_windows_child(notepad_handle)
    print(f"子窗口数量: {len(child_windows)}")
else:
    print("未找到记事本窗口")

# 获取所有窗口信息
def list_windows():
    """列出所有可见窗口"""
    def enum_windows_callback(hwnd, windows):
        if win32gui.IsWindowVisible(hwnd):
            window_text = win32gui.GetWindowText(hwnd)
            if window_text:
                windows.append((hwnd, window_text))
        return True

    windows = []
    win32gui.EnumWindows(enum_windows_callback, windows)
    return windows

# 显示所有窗口
all_windows = list_windows()
for hwnd, title in all_windows[:10]:  # 显示前10个
    print(f"窗口: {title} (句柄: {hwnd})")

2. 文件编译

Python文件编译

from sindre.win_tools import tools

# 编译整个目录
tools.py2pyd(r"C:\project\src", clear_py=False)

# 编译并删除原文件
tools.py2pyd(r"C:\project\src", clear_py=True)

# 编译特定目录
tools.py2pyd(r"C:\project\src\utils", clear_py=False)

包管理

from sindre.win_tools import tools

# 安装单个包
tools.pip_install(package_name="numpy")

# 安装到指定目录
tools.pip_install(package_name="pandas", target_dir=r"C:\custom_packages")

# 从requirements文件安装
tools.pip_install(requirements_path=r"C:\project\requirements.txt")

# 安装到指定目录
tools.pip_install(requirements_path=r"C:\project\requirements.txt", 
                 target_dir=r"C:\project\packages")

3. Python环境管理

from sindre.win_tools import tools

# 安装Python 3.9.6
tools.python_installer(r"C:\Python39", version="3.9.6")

# 安装Python 3.8.10
tools.python_installer(r"C:\Python38", version="3.8.10")

# 安装最新版本
tools.python_installer(r"C:\Python", version="3.11.0")

4. 安装包制作

from sindre.win_tools import tools

# 基本安装包制作
tools.exe2nsis(
    work_dir=r"C:\project",
    files_to_compress=[
        r"C:\project\app.exe",
        r"C:\project\config.ini",
        r"C:\project\data\"
    ],
    exe_name="MyApp.exe"
)

# 自定义安装包
tools.exe2nsis(
    work_dir=r"C:\project",
    files_to_compress=[
        r"C:\project\app.exe",
        r"C:\project\lib\",
        r"C:\project\resources\"
    ],
    exe_name="MyApp.exe",
    appname="我的应用",
    version="2.1.0",
    author="张三",
    license="MIT",
    icon_old=r"C:\project\icon.ico"
)

5. 系统工具

端口管理

from sindre.win_tools import tools

# 检查端口占用
port = 8080
if tools.check_port(port):
    print(f"端口 {port} 被占用")

    # 杀死占用进程
    if tools.kill_process_using_port(port):
        print(f"成功杀死占用端口 {port} 的进程")
    else:
        print(f"无法杀死占用端口 {port} 的进程")
else:
    print(f"端口 {port} 可用")

服务管理

from sindre.win_tools import tools

# 检查服务是否存在
service_name = "MySQL"
if tools.is_service_exists(service_name):
    print(f"服务 {service_name} 存在")
else:
    print(f"服务 {service_name} 不存在")

文件下载和解压

from sindre.win_tools import tools

# 下载文件
url = "https://example.com/file.zip"
if tools.download_url_file(url, "downloaded_file.zip"):
    print("文件下载成功")

    # 解压文件
    if tools.zip_extract("downloaded_file.zip", r"C:\extracted"):
        print("文件解压成功")
    else:
        print("文件解压失败")
else:
    print("文件下载失败")

🚀 高级功能

1. 网络工具

TCP映射

from sindre.win_tools import tools

# 创建TCP映射
mapping = tools.tcp_mapping_qt(conn_receiver, conn_sender)
mapping.start()

# IP绑定
ip_binder = tools.ip_bind()
ip_binder.set_ip("192.168.1.100", "8080")
ip_binder.start()

2. 批量操作

from sindre.win_tools import tools
import os

# 批量编译多个目录
directories = [
    r"C:\project\src\utils",
    r"C:\project\src\models",
    r"C:\project\src\controllers"
]

for directory in directories:
    if os.path.exists(directory):
        print(f"编译目录: {directory}")
        tools.py2pyd(directory, clear_py=False)
    else:
        print(f"目录不存在: {directory}")

# 批量安装包
packages = ["numpy", "pandas", "matplotlib", "scikit-learn"]
for package in packages:
    print(f"安装包: {package}")
    tools.pip_install(package_name=package)

3. 自动化脚本

from sindre.win_tools import tools
import os

def setup_development_environment():
    """设置开发环境"""

    # 1. 安装Python
    python_dir = r"C:\Python39"
    if not os.path.exists(python_dir):
        print("安装Python...")
        tools.python_installer(python_dir, version="3.9.6")

    # 2. 安装依赖包
    requirements_file = r"C:\project\requirements.txt"
    if os.path.exists(requirements_file):
        print("安装依赖包...")
        tools.pip_install(requirements_path=requirements_file)

    # 3. 编译源代码
    src_dir = r"C:\project\src"
    if os.path.exists(src_dir):
        print("编译源代码...")
        tools.py2pyd(src_dir, clear_py=False)

    # 4. 制作安装包
    print("制作安装包...")
    tools.exe2nsis(
        work_dir=r"C:\project",
        files_to_compress=[
            r"C:\project\app.exe",
            r"C:\project\src\",
            r"C:\project\config\"
        ],
        exe_name="MyApp.exe"
    )

    print("开发环境设置完成!")

# 执行设置
setup_development_environment()

🔧 系统集成

1. 与CI/CD集成

from sindre.win_tools import tools
import os

def ci_build():
    """CI/CD构建流程"""

    # 检查环境
    if not os.path.exists("requirements.txt"):
        print("缺少requirements.txt文件")
        return False

    # 安装依赖
    tools.pip_install(requirements_path="requirements.txt")

    # 编译代码
    tools.py2pyd("src", clear_py=False)

    # 制作安装包
    tools.exe2nsis(
        work_dir=".",
        files_to_compress=["app.exe", "src/", "config/"],
        exe_name="AppInstaller.exe"
    )

    return True

if __name__ == "__main__":
    success = ci_build()
    exit(0 if success else 1)

2. 与PyInstaller集成

from sindre.win_tools import tools
import subprocess

def build_with_pyinstaller():
    """使用PyInstaller构建"""

    # 安装PyInstaller
    tools.pip_install(package_name="pyinstaller")

    # 使用PyInstaller构建
    subprocess.run([
        "pyinstaller",
        "--onefile",
        "--windowed",
        "app.py"
    ])

    # 制作安装包
    tools.exe2nsis(
        work_dir=".",
        files_to_compress=["dist/app.exe", "config/"],
        exe_name="AppSetup.exe"
    )

build_with_pyinstaller()

❓ 常见问题

Q1: 编译时出现Cython错误?

A: 需要安装Cython:

tools.pip_install(package_name="cython")

Q2: 窗口透明度设置不生效?

A: 确保已安装pywin32:

tools.pip_install(package_name="pywin32")

Q3: NSIS安装包制作失败?

A: 检查以下几点: 1. 确保文件路径存在 2. 确保有足够的磁盘空间 3. 检查文件权限

Q4: 端口检查不准确?

A: 使用管理员权限运行程序,或者:

# 手动检查端口
import socket
def check_port_manual(port):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        return s.connect_ex(('localhost', port)) == 0

Q5: Python安装失败?

A: 可能的原因: 1. 网络连接问题 2. 磁盘空间不足 3. 权限不足

Q6: 如何调试编译问题?

A: 查看编译日志:

# 编译时保留临时文件
tools.py2pyd("src", clear_py=False)
# 检查tmp目录中的编译日志

📊 性能基准

操作 数据大小 时间 内存使用
文件编译 100个PY文件 ~30s ~50MB
安装包制作 100MB文件 ~60s ~200MB
Python安装 标准安装 ~120s ~500MB
窗口透明度 单个窗口 ~0.1s ~1MB

🔗 相关链接


如有问题,请查看 常见问题 或提交 Issue