屏幕颜色拾取器 (Screen Color Picker)
功能介绍
这是一个简单的桌面应用程序,允许用户实时拾取屏幕上任何位置的像素颜色。它会显示该颜色的 RGB 值和十六进制(Hex)值,并提供一键复制这些值到剪贴板的功能。
主要功能:
- 实时拾取: 鼠标移动到屏幕任何位置,即可显示该点的颜色。
- 颜色值显示: 同时显示 RGB (如
255, 100, 50) 和 十六进制 (如#ff6432) 格式的颜色值。 - 颜色预览: 提供一个色块实时显示当前选中的颜色。
- 一键复制: 方便地复制 RGB 或 Hex 值到剪贴板。
- 状态切换: 使用快捷键 (
F8) 启动或暂停颜色拾取。暂停时会自动复制当前 Hex 值。 - 置顶显示: 窗口默认保持在其他窗口之上,方便使用。
- 快捷退出: 按
Esc键可快速退出程序。 - 跨平台: 基于 Python 和相关库,理论上可在 Windows, macOS, Linux 上运行(需安装依赖和相应权限)。
使用说明
运行程序
- Windows (推荐):
- 下载
color_picker.exe文件。 - 直接双击
color_picker.exe文件运行。程序窗口会出现在屏幕上。
- 下载
- 其他系统 (或从源码运行):
- 确保已安装 Python 3。
- 打开终端或命令行,安装所需依赖库:
(pip install pynput pyautogui Pillowtkinter通常随 Python 内置,Pillow是pyautogui常用的图像处理依赖)。 - 将上面的 Python 代码保存为
color_picker.py文件。 - 在终端中,切换到
color_picker.py文件所在的目录,然后运行:python color_picker.py - 注意: 在某些操作系统(如 macOS)上,可能需要授予程序访问屏幕内容的权限。
操作方法
- 启动/暂停拾取:
- 程序启动后,默认处于暂停状态,状态栏显示 "按 F8 开始拾取 (Esc 退出)"。
- 按下键盘上的
F8键,程序状态栏会提示 "拾取中...",此时开始实时拾取鼠标指针下的颜色。 - 再次按下
F8键,程序状态栏会提示 "已暂停...",拾取暂停,颜色值和预览区会保持在暂停前的状态。暂停时会自动将当前颜色的 Hex 值复制到剪贴板,并短暂提示 "已复制 Hex!"。
- 查看颜色:
- 当拾取功能激活时 (
拾取中...状态),将鼠标移动到屏幕上你想要拾取颜色的位置。 - 程序窗口中的颜色预览块、RGB 值和 Hex 值会实时更新。
- 当拾取功能激活时 (
- 复制颜色值:
- 点击 RGB 值右侧的 "复制" 按钮,可以将当前显示的 RGB 值 (格式:
R, G, B) 复制到剪贴板。状态栏会短暂提示 "已复制 RGB!"。 - 点击 Hex 值右侧的 "复制" 按钮,可以将当前显示的 Hex 值 (格式:
#RRGGBB) 复制到剪贴板。状态栏会短暂提示 "已复制 Hex!"。 - 如上所述,暂停拾取时(按 F8)会自动复制 Hex 值。
- 点击 RGB 值右侧的 "复制" 按钮,可以将当前显示的 RGB 值 (格式:
- 退出程序:
- 可以直接点击窗口右上角的关闭按钮 (
X)。 - 也可以在程序运行时,随时按下键盘上的
Esc键,程序将自动关闭。
- 可以直接点击窗口右上角的关闭按钮 (
创作过程
- 需求分析: 目标是创建一个简单、直观的工具,用于快速获取屏幕上任意点的颜色信息(RGB 和 Hex),并能方便地复制这些信息。需要一个图形界面,并且能够全局监听鼠标位置。
- 技术选型:
- GUI 框架: 选择 Python 内置的
tkinter库。优点是无需额外安装,易于打包,且功能满足需求。 - 屏幕颜色获取: 使用
pyautogui库。其pyautogui.pixel(x, y)函数能直接、方便地获取屏幕指定坐标的像素颜色。 - 全局鼠标/键盘监听: 使用
pynput库。它能创建独立于 GUI 窗口焦点的全局监听器,这对于屏幕拾色器至关重要(用户鼠标通常不在程序窗口内)。监听器需要在单独的线程中运行,避免阻塞 GUI。 - 线程管理: 使用 Python 内置的
threading库来运行pynput监听器,避免 GUI 卡顿。使用threading.Event来优雅地通知监听器线程停止。 - 打包工具: 选用
PyInstaller。它可以将 Python 脚本及其依赖打包成单个可执行文件(如.exe),方便最终用户使用。
- GUI 框架: 选择 Python 内置的
- 界面设计 (UI):
- 使用
tkinter创建主窗口,设置标题、初始大小、禁止调整大小,并使其置顶 (attributes("-topmost", True))。 - 采用
grid布局管理器来组织控件,分为三列(标签、值、按钮)和四行(预览、RGB、Hex、状态)。 - 设计了一个
tk.Label作为颜色预览块,通过改变其bg(背景色) 属性来显示颜色。 - 为 RGB 和 Hex 值分别创建了标签和带边框的值显示标签 (
relief=tk.GROOVE)。 - 添加了 "复制" 按钮,并关联到
copy_to_clipboard函数。 - 底部设置了一个状态栏 (
tk.Label带relief=tk.SUNKEN),用于显示当前操作状态和提示信息。
- 使用
- 核心逻辑实现:
- 监听器线程: 创建一个
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中处理),该函数负责设置停止事件、销毁窗口并最终退出程序。
- 监听器线程: 创建一个
- 打包与测试:
- 编写
requirements.txt(虽然对于最终用户不需要,但对开发者有用)。 - 使用
PyInstaller命令 (pyinstaller --onefile --windowed --name color_picker color_picker.py) 生成单文件、无控制台窗口的color_picker.exe。 - 在 Windows 环境下测试
.exe文件的功能,包括拾取、复制、切换状态和退出。
- 编写
- 文档编写: 创建此
README.md文件,详细说明功能、使用方法和开发过程。