python实现的屏幕颜色拾取器

282 阅读6分钟

屏幕颜色拾取器 (Screen Color Picker)

功能介绍

这是一个简单的桌面应用程序,允许用户实时拾取屏幕上任何位置的像素颜色。它会显示该颜色的 RGB 值和十六进制(Hex)值,并提供一键复制这些值到剪贴板的功能。

主要功能:

  • 实时拾取: 鼠标移动到屏幕任何位置,即可显示该点的颜色。
  • 颜色值显示: 同时显示 RGB (如 255, 100, 50) 和 十六进制 (如 #ff6432) 格式的颜色值。
  • 颜色预览: 提供一个色块实时显示当前选中的颜色。
  • 一键复制: 方便地复制 RGB 或 Hex 值到剪贴板。
  • 状态切换: 使用快捷键 (F8) 启动或暂停颜色拾取。暂停时会自动复制当前 Hex 值。
  • 置顶显示: 窗口默认保持在其他窗口之上,方便使用。
  • 快捷退出: 按 Esc 键可快速退出程序。
  • 跨平台: 基于 Python 和相关库,理论上可在 Windows, macOS, Linux 上运行(需安装依赖和相应权限)。

使用说明

运行程序

  • Windows (推荐):
    1. 下载 color_picker.exe 文件。
    2. 直接双击 color_picker.exe 文件运行。程序窗口会出现在屏幕上。
  • 其他系统 (或从源码运行):
    1. 确保已安装 Python 3。
    2. 打开终端或命令行,安装所需依赖库:
      pip install pynput pyautogui Pillow
      
      (tkinter 通常随 Python 内置,Pillowpyautogui 常用的图像处理依赖)。
    3. 将上面的 Python 代码保存为 color_picker.py 文件。
    4. 在终端中,切换到 color_picker.py 文件所在的目录,然后运行:
      python color_picker.py
      
    5. 注意: 在某些操作系统(如 macOS)上,可能需要授予程序访问屏幕内容的权限。

操作方法

  1. 启动/暂停拾取:
    • 程序启动后,默认处于暂停状态,状态栏显示 "按 F8 开始拾取 (Esc 退出)"。
    • 按下键盘上的 F8 键,程序状态栏会提示 "拾取中...",此时开始实时拾取鼠标指针下的颜色。
    • 再次按下 F8 键,程序状态栏会提示 "已暂停...",拾取暂停,颜色值和预览区会保持在暂停前的状态。暂停时会自动将当前颜色的 Hex 值复制到剪贴板,并短暂提示 "已复制 Hex!"。
  2. 查看颜色:
    • 当拾取功能激活时 (拾取中... 状态),将鼠标移动到屏幕上你想要拾取颜色的位置。
    • 程序窗口中的颜色预览块、RGB 值和 Hex 值会实时更新。
  3. 复制颜色值:
    • 点击 RGB 值右侧的 "复制" 按钮,可以将当前显示的 RGB 值 (格式: R, G, B) 复制到剪贴板。状态栏会短暂提示 "已复制 RGB!"。
    • 点击 Hex 值右侧的 "复制" 按钮,可以将当前显示的 Hex 值 (格式: #RRGGBB) 复制到剪贴板。状态栏会短暂提示 "已复制 Hex!"。
    • 如上所述,暂停拾取时(按 F8)会自动复制 Hex 值。
  4. 退出程序:
    • 可以直接点击窗口右上角的关闭按钮 (X)。
    • 也可以在程序运行时,随时按下键盘上的 Esc 键,程序将自动关闭。

创作过程

  1. 需求分析: 目标是创建一个简单、直观的工具,用于快速获取屏幕上任意点的颜色信息(RGB 和 Hex),并能方便地复制这些信息。需要一个图形界面,并且能够全局监听鼠标位置。
  2. 技术选型:
    • GUI 框架: 选择 Python 内置的 tkinter 库。优点是无需额外安装,易于打包,且功能满足需求。
    • 屏幕颜色获取: 使用 pyautogui 库。其 pyautogui.pixel(x, y) 函数能直接、方便地获取屏幕指定坐标的像素颜色。
    • 全局鼠标/键盘监听: 使用 pynput 库。它能创建独立于 GUI 窗口焦点的全局监听器,这对于屏幕拾色器至关重要(用户鼠标通常不在程序窗口内)。监听器需要在单独的线程中运行,避免阻塞 GUI。
    • 线程管理: 使用 Python 内置的 threading 库来运行 pynput 监听器,避免 GUI 卡顿。使用 threading.Event 来优雅地通知监听器线程停止。
    • 打包工具: 选用 PyInstaller。它可以将 Python 脚本及其依赖打包成单个可执行文件(如 .exe),方便最终用户使用。
  3. 界面设计 (UI):
    • 使用 tkinter 创建主窗口,设置标题、初始大小、禁止调整大小,并使其置顶 (attributes("-topmost", True))。
    • 采用 grid 布局管理器来组织控件,分为三列(标签、值、按钮)和四行(预览、RGB、Hex、状态)。
    • 设计了一个 tk.Label 作为颜色预览块,通过改变其 bg (背景色) 属性来显示颜色。
    • 为 RGB 和 Hex 值分别创建了标签和带边框的值显示标签 (relief=tk.GROOVE)。
    • 添加了 "复制" 按钮,并关联到 copy_to_clipboard 函数。
    • 底部设置了一个状态栏 (tk.Labelrelief=tk.SUNKEN),用于显示当前操作状态和提示信息。
  4. 核心逻辑实现:
    • 监听器线程: 创建一个 run_listeners 函数作为 pynput 监听器的运行目标。在此函数内启动 mouse.Listener (关联 on_move) 和 keyboard.Listener (关联 on_press)。使用 threading.Event (listener_stop_event) 来等待停止信号,确保监听器可以被主程序控制停止。该函数在一个单独的守护线程 (daemon=True) 中运行。
    • 鼠标移动处理 (on_move): 当拾取激活 (picking_active == True) 时,获取鼠标坐标 (x, y),调用 pyautogui.pixel(x, y) 获取颜色。为减少不必要的 GUI 更新,只有当获取到的颜色与上次不同时,才更新全局颜色变量 (current_color_rgb, current_color_hex),并通过 root.after(0, update_color_display) 将 GUI 更新任务安全地发送到主线程队列。
    • 键盘事件处理 (on_press): 监听 F8 键用于调用 toggle_picking 函数切换拾取状态。监听 Esc 键用于设置 listener_stop_event,停止监听器,并通过 root.after 调用 root.quit 来结束 Tkinter 主循环,从而关闭程序。
    • 状态切换 (toggle_picking): 切换布尔变量 picking_active 的值,并相应地更新状态栏的文本。在从激活切换到暂停时,自动调用 copy_to_clipboard('hex')
    • 复制功能 (copy_to_clipboard): 根据传入的类型('rgb' 或 'hex')格式化颜色字符串,使用 root.clipboard_clear()root.clipboard_append() 将其放入系统剪贴板。同时更新状态栏给出反馈,并在短暂延迟后恢复原状态文本。
    • GUI 更新 (update_color_display): 此函数运行在主线程,负责根据全局颜色变量更新界面上所有相关的 tk.Label(包括预览块的背景色和值标签的文本)。还加入了根据背景色亮度动态调整文字颜色的逻辑,以保证可读性。
    • 程序退出: 结合了 Esc 键和窗口关闭按钮 (WM_DELETE_WINDOW 协议) 两种退出方式。两者都会触发 on_closing 函数(或直接在 on_press 中处理),该函数负责设置停止事件、销毁窗口并最终退出程序。
  5. 打包与测试:
    • 编写 requirements.txt (虽然对于最终用户不需要,但对开发者有用)。
    • 使用 PyInstaller 命令 (pyinstaller --onefile --windowed --name color_picker color_picker.py) 生成单文件、无控制台窗口的 color_picker.exe
    • 在 Windows 环境下测试 .exe 文件的功能,包括拾取、复制、切换状态和退出。
  6. 文档编写: 创建此 README.md 文件,详细说明功能、使用方法和开发过程。

1.png