基于Python制作一款屏幕颜色提取器

 更新时间:2022年03月02日 10:54:07   作者:slandarer  
这篇文章主要为大家介绍了如何利用Python制作一款简易的屏幕颜色提取器,文中的示例代码讲解详细,对我们学习Python有一定帮助,感兴趣的可以动手试一试

1.使用效果

如下面动图所示,点击取色按钮后,将鼠标移动到想要取色的位置,等待两秒即可取色:

点击save color按钮可以将颜色存储到color library区域,同时如图所示,

! ! ! !红框内所有的方形元件其实都是按钮,点击后能获得颜色信息 ! ! ! !

信息格式为:(173, 189, 163) #ADBDA3 (48, 35, 189)

2.所需python包

  • PySide2
  • pyautogui
  • pyperclip
  • ctypes
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 *

3.python小技巧

3.1控件数组

和matlab一样,python得控件也能构成数组,例如我在创建小颜色框时,是这么写的:

# 存储颜色框
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)

就是将各个颜色框存入了self.storeList这个数组,

想要例如想要调用第i个颜色框,就可以这么写:

storeBox=self.storeList[i]

3.2将控件作为属性

将控件控件作为属性赋给另一个控件

因为我们想要点击左侧标签时获得对应文本框内信息:

就可以这么写(举个例子):

# 创建文本框
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.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)# 与回调函数相连

然后我的回调函数是这样写的:

def copyInf(self):
    infLabel=self.sender()
    infBox=infLabel.property('Children') # 通过找到属性找到对应控件
    pyperclip.copy(infBox.text())

3.3怎样重设控件颜色

还是通过setStyleSheet设置嗷,不过把字符串部分应该放颜色的部分换成了要重设的颜色:

self.mainBox.setStyleSheet("QPushButton{background:"+self.curColor_HEX
        +";border: 3px solid rgb(150,150,150);border-radius:8px}")

3.4一些用到的字符串操作

字符串字母大写

STR=STR.upper()

字符串去掉空格

例如把(10, 50, 255)变为(10,50,255)

STR=STR.replace(" ", "")

字符串去掉两头括号

例如把(10,50,255)变为10,50,255

STR=STR[1:-1]

3.5鼠标位置像素颜色

如何获得当前鼠标位置像素颜色

import pyautogui as pag
from ctypes import *

x,y=pag.position()
RGB=get_color(x,y)

# 获取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]

3.6窗口始终置顶

self.setWindowFlags(Qt.WindowStaysOnTopHint) 

3.7文本框不允许编辑但允许复制

用setFocusPolicy(Qt.NoFocus),例如程序中:

self.CB1.setFocusPolicy(Qt.NoFocus)
self.CB2.setFocusPolicy(Qt.NoFocus)
self.CB3.setFocusPolicy(Qt.NoFocus)

4.完整代码

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_())

以上就是基于Python制作一款屏幕颜色提取器的详细内容,更多关于Python屏幕颜色提取器的资料请关注脚本之家其它相关文章!

相关文章

  • Python代码中偏函数的使用详解

    Python代码中偏函数的使用详解

    Python中的偏函数是来自函数式编程的一个强大工具,它的主要目标是减少函数调用的复杂性,本文将详细介绍偏函数的具体使用,需要的小伙伴可以了解下
    2023-12-12
  • Python语法学习之正则表达式的量词汇总

    Python语法学习之正则表达式的量词汇总

    通过正则的规则匹配到的信息都是一个单独的字符存到输出结果中的,如何更够根据字符串中的词组进行匹配呢?因此本文将带大家学习一下正则表达式中的量词符号与组的概念,感兴趣的可以了解一下
    2022-04-04
  • tensorflow模型转ncnn的操作方式

    tensorflow模型转ncnn的操作方式

    这篇文章主要介绍了tensorflow模型转ncnn的操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python可视化实现代码

    python可视化实现代码

    今天小编就为大家分享一篇关于python可视化实现代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Python使用PDFMiner解析PDF代码实例

    Python使用PDFMiner解析PDF代码实例

    本篇文章主要介绍了Python使用PDFMiner解析PDF代码实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 聊聊通过celery_one避免Celery定时任务重复执行的问题

    聊聊通过celery_one避免Celery定时任务重复执行的问题

    Celery Once 也是利用 Redis 加锁来实现, Celery Once 在 Task 类基础上实现了 QueueOnce 类,该类提供了任务去重的功能,今天通过本文给大家介绍通过celery_one避免Celery定时任务重复执行的问题,感兴趣的朋友一起看看吧
    2021-10-10
  • python实现给数组按片赋值的方法

    python实现给数组按片赋值的方法

    这篇文章主要介绍了python实现给数组按片赋值的方法,实例分析了Python在指定位置进行赋值的相关技巧,需要的朋友可以参考下
    2015-07-07
  • Python开发入门——迭代的基本使用

    Python开发入门——迭代的基本使用

    这篇文章主要介绍了Python 迭代的相关资料,帮助大家更好的理解和学习python开发,感兴趣的朋友可以了解下
    2020-09-09
  • python中的默认编码使用

    python中的默认编码使用

    这篇文章主要介绍了python中的默认编码使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • python爬虫urllib中的异常模块处理

    python爬虫urllib中的异常模块处理

    这篇文章主要为大家介绍了python爬虫在爬取网页时urllib中的异常模块处理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05

最新评论