Python使用pyqt制作颜色提取器

效果展示

实现代码

from PySide2.QtWidgets import QApplication, QWidget, QLineEdit
from PySide2.QtWidgets import QLabel, QPushButton
from PySide2.QtGui import QIcon, QFont
from PySide2.QtCore import Qt

import sys

sys.path.append("...")

import time
import pyautogui as pag
import pyperclip
from ctypes import *


# ===========================================================================================
# 相关函数:


# 获取x,y位置像素颜色
def get_color(x, y):
    gdi32 = windll.gdi32
    user32 = windll.user32
    hdc = user32.GetDC(None)  # 获取颜色值
    pixel = gdi32.GetPixel(hdc, x, y)  # 提取RGB值
    r = pixel & 0x0000ff
    g = (pixel & 0x00ff00) >> 8
    b = pixel >> 16
    return [r, g, b]


# HEX转RGB
def hex2rgb(hexcolor):
    '''HEX转RGB

    :param hexcolor: int or str
    :return: Tuple[int, int, int]

    >>> hex2rgb(16777215)
    (255, 255, 255)
    >>> hex2rgb('0xffffff')
    (255, 255, 255)
    '''
    hexcolor = int(hexcolor, base=16) if isinstance(hexcolor, str) else hexcolor
    rgb = ((hexcolor >> 16) & 0xff, (hexcolor >> 8) & 0xff, hexcolor & 0xff)
    return rgb


# RGB转HEX
def rgb2hex(r, g, b):
    color = "#"
    color += str(hex(r)).replace('x', '0')[-2:]
    color += str(hex(g)).replace('x', '0')[-2:]
    color += str(hex(b)).replace('x', '0')[-2:]
    return color


# RGB转HSV
def rgb2hsv(r, g, b):
    r, g, b = r / 255.0, g / 255.0, b / 255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    m = mx - mn
    if mx == mn:
        h = 0
    elif mx == r:
        if g >= b:
            h = ((g - b) / m) * 60
        else:
            h = ((g - b) / m) * 60 + 360
    elif mx == g:
        h = ((b - r) / m) * 60 + 120
    elif mx == b:
        h = ((r - g) / m) * 60 + 240
    if mx == 0:
        s = 0
    else:
        s = m / mx
    v = mx
    H = h / 2
    S = s * 255.0
    V = v * 255.0
    return (round(H), round(S), round(V))


# ===========================================================================================
# 窗口类:
class Window(QWidget):
    def __init__(self, Width=450, Height=600):
        super().__init__()
        self.setWindowTitle("getScreenColor")
        self.setWindowFlags(Qt.WindowStaysOnTopHint)
        self.Width = Width
        self.Height = Height

        # 样式表
        self.SS_bkg_Label = "QLabel{background: rgb(220,220,220);color:rgb(62,62,62);border-radius:8px}"
        self.SS_Inf_Label = "QPushButton{background: rgb(79,148,204);color:rgb(240,240,240);border-radius:8px}"
        self.SS_Inf_Box = "QLineEdit{border-radius:3px;border: 2px solid rgb(149,179,215);color:rgb(92,92,92)}"
        self.SS_Main_Box = "QPushButton{background: #FFFFFF;border: 3px solid rgb(150,150,150);border-radius:8px}"
        self.SS_Color_Box = "QPushButton{background: #FFFFFF;border: 2px solid rgb(150,150,150);border-radius:3px}"
        self.SS_btn_1 = "QPushButton{background: rgb(214,219,233);color:rgb(82,82,82)}"
        self.SS_btn_2 = "QPushButton{background: rgb(225,235,205);color:rgb(82,82,82)}"
        self.SS_btn_3 = "QPushButton{background: rgb(232,191,190);color:rgb(82,82,82)}"

        # 该类私有变量或属性
        self.defaultColor = ['#58827E', '#144853', '#4C6756', '#849E77', '#ADBDA3',
                             '#6B1B1E', '#A94047', '#E05E60', '#F8A2AF', '#E4CEDB',
                             '#B0A087', '#7F877C', '#C7C7BB', '#D4C7BE', '#E3E4DF',
                             '#C63866', '#FE676E', '#FD8F52', '#FFBF73', '#FFDCA2',
                             '#7292B8', '#769EB8', '#B4C5D7', '#C5D5EC', '#D9E0EA',
                             '#681F71', '#7E0D5D', '#6E57A5', '#B589BE', '#C993B7',
                             '#3978A4', '#81AAAE', '#EBCFC4', '#FDB8A8', '#E3929B', '#7D7294']
        self.curBoxId = 0
        self.curColor_RGB = [255, 255, 255]
        self.curColor_HEX = '#FFFFFF'
        self.curColor_HSV = [0, 0, 255]
        self.storeList = []
        self.defaultList = []

        # 框架构造函数调用
        self.setSize()
        self.partition()
        self.setInfBox()
        self.setMainBox()
        self.setBtn()
        self.setIcon()
        self.setColorBox()

    # ================================================================================================
    # 颜色框回调函数部分:
    def selectedMain(self):
        tColor_HEX = self.curColor_HEX
        tColor_RGB = hex2rgb('0x' + tColor_HEX[1:])
        tColor_HSV = rgb2hsv(tColor_RGB[0], tColor_RGB[1], tColor_RGB[2])
        pyperclip.copy(str(tColor_RGB) + ' ' + tColor_HEX + ' ' + str(tColor_HSV))
        print(str(tColor_RGB) + ' ' + tColor_HEX + ' ' + str(tColor_HSV))

    def selectedStore(self):
        storeBox = self.sender()
        tColor_HEX = storeBox.property("Color")
        tColor_RGB = hex2rgb('0x' + tColor_HEX[1:])
        tColor_HSV = rgb2hsv(tColor_RGB[0], tColor_RGB[1], tColor_RGB[2])
        pyperclip.copy(str(tColor_RGB) + ' ' + tColor_HEX + ' ' + str(tColor_HSV))
        print(str(tColor_RGB) + ' ' + tColor_HEX + ' ' + str(tColor_HSV))

    def selectedDefault(self):
        defaultBox = self.sender()
        tNum = defaultBox.property("defaultId")
        tColor_HEX = self.defaultColor[tNum]
        tColor_RGB = hex2rgb('0x' + tColor_HEX[1:])
        tColor_HSV = rgb2hsv(tColor_RGB[0], tColor_RGB[1], tColor_RGB[2])
        pyperclip.copy(str(tColor_RGB) + ' ' + tColor_HEX + ' ' + str(tColor_HSV))
        print(str(tColor_RGB) + ' ' + tColor_HEX + ' ' + str(tColor_HSV))

    # ------------------------------------------------------------------------------------------------
    # 颜色信息标签回调
    def copyInf(self):
        infLabel = self.sender()
        infBox = infLabel.property('Children')
        pyperclip.copy(infBox.text())
        print(infBox.text())

    # ------------------------------------------------------------------------------------------------
    # 按钮回调函数部分:
    def getColor(self):
        time.sleep(2)
        x, y = pag.position()
        self.curColor_RGB = get_color(x, y)
        self.curColor_HSV = rgb2hsv(self.curColor_RGB[0], self.curColor_RGB[1], self.curColor_RGB[2])
        self.curColor_HEX = rgb2hex(self.curColor_RGB[0], self.curColor_RGB[1], self.curColor_RGB[2]).upper()

        RGB_STR = str(self.curColor_RGB).replace(" ", "")[1:-1]
        HSV_STR = str(self.curColor_HSV).replace(" ", "")[1:-1]
        self.CB1.setText(RGB_STR)
        self.CB2.setText(self.curColor_HEX)
        self.CB3.setText(HSV_STR)
        self.mainBox.setStyleSheet("QPushButton{background:" + self.curColor_HEX
                                   + ";border: 3px solid rgb(150,150,150);border-radius:8px}")

    def saveColor(self):
        if self.curBoxId < 20:
            tempBox = self.storeList[self.curBoxId]
            tempBox.setProperty("Color", self.curColor_HEX)
            tempBox.setStyleSheet("QPushButton{background:" + self.curColor_HEX
                                  + ";border: 2px solid rgb(150,150,150);border-radius:3px}")
            self.curBoxId += 1

    def deleteColor(self):
        if self.curBoxId > 0:
            self.curBoxId -= 1
            tempBox = self.storeList[self.curBoxId]
            tempBox.setProperty("Color", '#FFFFFF')
            tempBox.setStyleSheet(self.SS_Color_Box)

    # ================================================================================================
    # 框架构造函数部分:
    def setSize(self):  # 调整框架大小
        self.setGeometry(80, 80, self.Width, self.Height)
        self.setMaximumSize(self.Width, self.Height)
        self.setMinimumSize(self.Width, self.Height)

    def setIcon(self):  # 设置图标
        appIcon = QIcon("ICON.ico")
        self.setWindowIcon(appIcon)

    def partition(self):  # 各部分划分
        Width = self.Width
        Height = self.Height
        qf = QFont()
        qf.setBold(True)
        qf.setPointSize(12)
        qf.setFamily("Cambria")
        # --part1--当前颜色显示框背景-----
        self.bkgLabel1 = QLabel(self)
        self.bkgLabel1.setGeometry(0.024 * Width, 0.015 * Height, 0.4 * Width, 0.3 * Height)
        self.bkgLabel1.setStyleSheet(self.SS_bkg_Label)
        # --part2--当前颜色信息背景-----
        self.bkgLabel2 = QLabel(self)
        self.bkgLabel2.setGeometry(0.448 * Width, 0.015 * Height, 0.528 * Width, 0.3 * Height)
        self.bkgLabel2.setStyleSheet("QLabel{background: rgb(235,235,235);border-radius:8px}")
        # --part3--颜色存储库背景-----
        self.bkgLabel3 = QLabel(self)
        self.bkgLabel3.setGeometry(0.024 * Width, 0.41 * Height, 0.952 * Width, 0.205 * Height)
        self.bkgLabel3.setStyleSheet(self.SS_bkg_Label)
        self.bkgLabel3_title = QLabel(self)
        self.bkgLabel3_title.setGeometry(0.038 * Width, 0.415 * Height, 0.4 * Width, 0.05 * Height)
        self.bkgLabel3_title.setStyleSheet(self.SS_bkg_Label)
        self.bkgLabel3_title.setText("Color Library")
        self.bkgLabel3_title.setFont(qf)
        # --part4--预设颜色库背景-----
        self.bkgLabel4 = QLabel(self)
        self.bkgLabel4.setGeometry(0.024 * Width, 0.63 * Height, 0.952 * Width, 0.355 * Height)
        self.bkgLabel4.setStyleSheet(self.SS_bkg_Label)
        self.bkgLabel4_title = QLabel(self)
        self.bkgLabel4_title.setGeometry(0.038 * Width, 0.635 * Height, 0.8 * Width, 0.05 * Height)
        self.bkgLabel4_title.setStyleSheet(self.SS_bkg_Label)
        self.bkgLabel4_title.setText("Color Library(default)")
        self.bkgLabel4_title.setFont(qf)

    def setInfBox(self):  # 设置信息显示框
        Width = self.Width
        Height = self.Height
        # 字体设置
        qf = QFont()
        qf.setBold(True)
        qf.setPointSize(12)
        qf.setFamily("Cambria")
        # 绘制颜色信息框
        qf.setPointSize(10)
        self.CB1 = QLineEdit(self)
        self.CB1.setText("255,255,255")
        self.CB1.move(0.62 * Width, 0.03 * Height)
        self.CB1.resize(0.35 * Width, 0.065 * Height)
        self.CB1.setFont(qf)
        self.CB1.setStyleSheet(self.SS_Inf_Box)
        #
        self.CB2 = QLineEdit(self)
        self.CB2.setText("#FFFFFF")
        self.CB2.move(0.62 * Width, 0.13 * Height)
        self.CB2.resize(0.35 * Width, 0.065 * Height)
        self.CB2.setFont(qf)
        self.CB2.setStyleSheet(self.SS_Inf_Box)
        #
        self.CB3 = QLineEdit(self)
        self.CB3.setText("0,0,255")
        self.CB3.move(0.62 * Width, 0.23 * Height)
        self.CB3.resize(0.35 * Width, 0.065 * Height)
        self.CB3.setFont(qf)
        self.CB3.setStyleSheet(self.SS_Inf_Box)
        #
        self.CB1.setFocusPolicy(Qt.NoFocus)
        self.CB2.setFocusPolicy(Qt.NoFocus)
        self.CB3.setFocusPolicy(Qt.NoFocus)
        # 绘制颜色信息标签
        self.CL1 = QPushButton(self)
        self.CL1.setGeometry(0.448 * Width, 0.025 * Height, 0.14 * Width, 0.075 * Height)
        self.CL1.setStyleSheet(self.SS_Inf_Label)
        self.CL1.setText("RGB")
        self.CL1.setFont(qf)
        self.CL1.setProperty('Children', self.CB1)
        self.CL1.clicked.connect(self.copyInf)
        #
        self.CL2 = QPushButton(self)
        self.CL2.setGeometry(0.448 * Width, 0.125 * Height, 0.14 * Width, 0.075 * Height)
        self.CL2.setStyleSheet(self.SS_Inf_Label)
        self.CL2.setText("HEX")
        self.CL2.setFont(qf)
        self.CL2.setProperty('Children', self.CB2)
        self.CL2.clicked.connect(self.copyInf)
        #
        self.CL3 = QPushButton(self)
        self.CL3.setGeometry(0.448 * Width, 0.225 * Height, 0.14 * Width, 0.075 * Height)
        self.CL3.setStyleSheet(self.SS_Inf_Label)
        self.CL3.setText("HSV")
        self.CL3.setFont(qf)
        self.CL3.setProperty('Children', self.CB3)
        self.CL3.clicked.connect(self.copyInf)

    def setMainBox(self):  # 设置其他label
        Width = self.Width
        Height = self.Height
        # 左上角当前颜色显示框
        self.mainBox = QPushButton(self)
        self.mainBox.setGeometry(0.04 * Width, 0.025 * Height, 0.368 * Width, 0.28 * Height)
        self.mainBox.setStyleSheet(self.SS_Main_Box)
        self.mainBox.clicked.connect(self.selectedMain)

    def setBtn(self):  # 设置按钮
        Width = self.Width
        Height = self.Height
        # 按钮字体
        qf = QFont()
        qf.setBold(True)
        qf.setPointSize(10)
        qf.setFamily("Cambria")
        # 获取颜色按钮
        self.bnt1 = QPushButton(self)
        self.bnt1.setGeometry(0.024 * Width, 0.33 * Height, 0.4 * Width, 0.06 * Height)
        self.bnt1.setStyleSheet(self.SS_btn_1)
        self.bnt1.setText("Get Screen Color")
        self.bnt1.setFont(qf)
        self.bnt1.clicked.connect(self.getColor)
        # 保存颜色按钮
        self.bnt2 = QPushButton(self)
        self.bnt2.setGeometry(0.444 * Width, 0.33 * Height, 0.26 * Width, 0.06 * Height)
        self.bnt2.setStyleSheet(self.SS_btn_1)
        self.bnt2.setText("Save Color")
        self.bnt2.setFont(qf)
        self.bnt2.clicked.connect(self.saveColor)
        # 删除颜色按钮
        self.bnt3 = QPushButton(self)
        self.bnt3.setGeometry(0.724 * Width, 0.33 * Height, 0.26 * Width, 0.06 * Height)
        self.bnt3.setStyleSheet(self.SS_btn_3)
        self.bnt3.setText("Delete Last")
        self.bnt3.setFont(qf)
        self.bnt3.clicked.connect(self.deleteColor)

    def setColorBox(self):  # 绘制存储颜色及预设颜色框
        Width = self.Width
        Height = self.Height
        # 存储颜色框
        for i in range(0, 2):
            for j in range(0, 10):
                storeColorBox = QPushButton(self)
                storeColorBox.setGeometry((0.04 + 0.093 * j) * Width, (0.475 + 0.07 * i) * Height, 0.08 * Width,
                                          0.06 * Height)
                storeColorBox.setStyleSheet(self.SS_Color_Box)
                storeColorBox.setProperty("storeId", i * 10 + j)
                storeColorBox.setProperty("Color", '#FFFFFF')
                storeColorBox.clicked.connect(self.selectedStore)
                self.storeList.append(storeColorBox)

        # 预设颜色框
        for i in range(0, 4):
            for j in range(0, 10):
                if i * 10 + j < 36:
                    defaultColorBox = QPushButton(self)
                    defaultColorBox.setGeometry((0.04 + 0.093 * j) * Width, (0.7 + 0.07 * i) * Height, 0.08 * Width,
                                                0.06 * Height)
                    defaultColorBox.setStyleSheet("QPushButton{background: "
                                                  + self.defaultColor[
                                                      i * 10 + j] + ";border: 2px solid rgb(150,150,150);border-radius:3px}")
                    defaultColorBox.setProperty("defaultId", i * 10 + j)
                    defaultColorBox.clicked.connect(self.selectedDefault)
                    self.defaultList.append(storeColorBox)


# ===========================================================================================
# 函数调用:
myapp = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(myapp.exec_())

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值