🎨 【开源工具】基于PyQt5构建现代化屏幕取色器:从基础到实现全攻略
Python现代屏幕取色器开发:从原理到实践全指南

🌈 个人主页:创客白泽 - CSDN博客
🔥
系列专栏:🐍《Python开源项目实战》
💡 热爱不止于代码,热情源于每一个灵感迸发的时刻。愿以开源之力,照亮前行之途。
🐋 期待大家多多支持,携手共进!
👍 🎉若文章对你有所助益,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗分享给更多人哟

摘要
本文详尽介绍怎样运用Python与PyQt5开发一款功能完善、界面美观的现代化屏幕取色工具。借助多线程技术实现实时颜色追踪,结合Win32 API来进行剪贴板操作,最终打造出一款兼具实用性与美观性的生产力工具。文章包含完整的实现代码、设计思路剖析以及性能优化办法。

一、项目概览
在UI设计、网页开发等场景中,颜色拾取是高频操作需求。本文所介绍的Modern Color Picker具有以下特点:
- 现代化UI设计 - 采用Fluent Design风格
- 高性能取色 - 借助多线程实现毫秒级响应
- 智能反馈 - 具备可视化颜色预览与复制提示功能
- 跨平台兼容 - 核心逻辑可在Windows和macOS上运行
二、核心功能剖析
2.1 实时颜色追踪
def track_mouse_color(self):
while not self.stop_thread:
if self.left_pressed:
x, y = pyautogui.position()
rgb = self.get_color_at(x, y)
self.color_changed.emit(rgb)
time.sleep(0.03)
- 由独立线程负责处理鼠标坐标的获取
- 利用信号槽机制来更新用户界面
- 以33fps的采样频率在性能与流畅度间取得平衡
2.2 智能颜色显示
# 根据亮度自动调整文本颜色
brightness = sqrt(0.299*color.red()**2 + 0.587*color.green()**2 + 0.114*color.blue()**2)
text_color = QColor("#ffffff" if brightness < 128 else "#333333")
通过光度公式实现智能反色,保证文字始终清晰可辨
三、效果呈现


四、实现步骤详解
4.1 环境配置
pip install pyqt5 pyautogui pillow pywin32
4.2 关键实现步骤
- 创建无边框窗口
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.setAttribute(Qt.WA_TranslucentBackground)
- 设计颜色预览组件
path.addRoundedRect(0, 0, self.width(), self.height(), 12, 12)
painter.fillPath(path, QColor(self.color))
- 实现拖拽取色逻辑
def on_mouse_down(self, event):
self.left_pressed = True
def on_mouse_up(self, event):
if self.left_pressed:
x, y = pyautogui.position()
rgb = self.get_color_at(x, y)
五、代码深度解析
5.1 架构设计

5.2 性能优化要点
- 双缓冲绘图 :
QPainter.setRenderHint(QPainter.Antialiasing)
- 资源复用 :重复利用QPixmap缓存
- 线程安全 :通过信号槽进行跨线程通信
六、完整源码
import sys
import pyautogui
from PIL import ImageGrab
import win32clipboard
import threading
import time
from math import sqrt
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,
QLabel, QPushButton, QFrame, QSizePolicy)
from PyQt5.QtCore import Qt, QSize, QPoint, QTimer, pyqtSignal
from PyQt5.QtGui import QColor, QPainter, QPainterPath, QFont, QFontDatabase, QPixmap, QIcon
class ModernColorPicker(QMainWindow):
color_changed = pyqtSignal(tuple) # 颜色变化信号
def __init__(self):
super().__init__()
self.setup_ui()
self.setup_window()
# 初始化变量
self.left_pressed = False
self.stop_thread = False
self.drag_start_pos = QPoint()
self.current_rgb = None
self.current_hex = None
# 启动颜色跟踪线程
self.track_thread = threading.Thread(target=self.track_mouse_color)
self.track_thread.daemon = True
self.track_thread.start()
# 连接信号
self.color_changed.connect(self.update_current_color)
def setup_window(self):
"""设置窗口属性"""
self.setWindowTitle("🎨 Modern Color Picker")
self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
self.setAttribute(Qt.WA_TranslucentBackground)
# 设置窗口大小和位置
screen = QApplication.primaryScreen().geometry()
self.setFixedSize(400, 550)
self.move(screen.width() - self.width() - 20,
(screen.height() - self.height()) // 2)
# 窗口阴影效果
self.shadow = QWidget(self)
self.shadow.setGeometry(3, 3, self.width(
相关文章
暂无评论...