【开源工具】基于Python的现代化屏幕取色器开发全攻略:从原理到实现

🎨 【开源工具】基于PyQt5的现代化屏幕取色器开发全攻略:从原理到实现

在这里插入图片描述
请添加图片描述

🌈 个人主页:创客白泽 - CSDN博客
🔥 系列专栏:🐍《Python开源项目实战》
💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。
🐋 希望大家多多支持,我们一起进步!
👍 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗分享给更多人哦

请添加图片描述

摘要

本文详细介绍如何使用Python和PyQt5开发一款功能完善、界面美观的现代化屏幕取色工具。通过多线程技术实现实时颜色追踪,结合Win32 API实现剪贴板操作,最终打造出一款兼具实用性和美观性的生产力工具。文章包含完整实现代码、设计思路解析和性能优化技巧。

在这里插入图片描述


一、项目概述

在UI设计、网页开发等场景中,颜色拾取是高频需求。本文介绍的Modern Color Picker具有以下特点:

  1. 现代化UI设计 - 采用Fluent Design风格
  2. 高性能取色 - 多线程实现毫秒级响应
  3. 智能反馈 - 可视化颜色预览+复制提示
  4. 跨平台兼容 - 核心逻辑支持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)
  • 独立线程处理鼠标坐标获取
  • 通过信号槽机制更新UI
  • 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 关键实现步骤

  1. 创建无边框窗口
   self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
   self.setAttribute(Qt.WA_TranslucentBackground)
  1. 设计颜色预览组件
   path.addRoundedRect(0, 0, self.width(), self.height(), 12, 12)
   painter.fillPath(path, QColor(self.color))
  1. 实现拖拽取色逻辑
   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 性能优化点

  1. 双缓冲绘图QPainter.setRenderHint(QPainter.Antialiasing)
  2. 资源复用:重复使用QPixmap缓存
  3. 线程安全:通过信号槽跨线程通信

六、完整源码

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
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

创客白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值