在python的tkinter中,用自己写的调色板代替askcolor()

一、创作灵感

tkinter中的askcolor()功能已经很强大了,是系统内置的调色板程序,但其存在一个小问题,就是没有预置颜色,有时需要直接选取预置的颜色,为此,就用tkinter写了一个小程序,内置100多种颜色,方便使用。

二、写作说明

 定义的调色板是仅用tkinter写成,定义了三个按钮,分别为确定、取消和调用系统调色板,样式为:

点击预置好的基本颜色或滑动左侧滑动条,可以改变颜色,颜色实时在背景中显示。点确定,返回当前的(R,G,B),点调用系统调色板,可以在系统调色板中选取颜色并返回对应值。点取消或关闭按钮,返回 None 。

函数名称为:color_choice

调用方法:color_choice((R,G,B))  或 color_choice()

传递来的参数为进入时初始的颜色,格式 (R,G,B),R、G、B为0-255之间的整数 。

返回值:(R,G,B) 或 None

返回值格式 (R,G,B),R、G、B为0-255之间的整数 。

三、完整代码

 直接将代码复制就能运行,如果不能运行,需要先安装tkinter,用命令:

pip install tkinter

安装tkinter。

代码中部分过程用了中文,本人感觉不影响运行,且可以减少说明,不习惯的可以替换掉哦。

完整代码如下:

# encoding:utf-8
# Copyright (C) 2021-2024  Liu Qinghao
__author__ = 'Liu Qinghao' # csdn.net 学习交流文章

from tkinter import *
from tkinter.colorchooser import askcolor

def color_choice(color=(240,240,240)):
    '''选择颜色,传递来的参数 color 为进入时初始的颜色,格式 (R,G,B)
    R、G、B为0-255之间的整数
    调用方法:color_choice((R,G,B))  或 color_choice()
    返回值:(R,G,B) 或 None
    '''
    def 确定():
        root.destroy()  #关闭窗口
        root.quit()
        return

    def 取消():
        nonlocal rgbcolor
        root.destroy()  #关闭窗口
        root.quit()
        rgbcolor=None
        return

    def RGB_to_Hex(rgb): # RGB格式颜色转换为16进制颜色格式
        if '#' in rgb:
            return rgb
        RGB = (rgb[0],rgb[1],rgb[2])   # 将RGB格式划分开来
        color = '#'
        for i in RGB:
            num = int(i)
            # 将R、G、B分别转化为16进制拼接转换并大写  hex() 函数用于将10进制整数转换成16进制,以字符串形式表示
            color += str(hex(num))[-2:].replace('x', '0').upper()
        return color

    def getrgbcolor(): # 获取当前颜色值
        nonlocal rgbcolor
        red   = int(rSlider.get()) #获取数据
        green = int(gSlider.get())
        blue  = int(bSlider.get())
        rgbcolor=(red, green, blue)
        return rgbcolor
        
    def bgUpdate(resure):
        nonlocal rgbcolor
        '''更改窗口颜色'''
        rgbcolor=getrgbcolor()
        myColor = "#%02x%02x%02x" % rgbcolor # 十六进制化
        root.config(bg=myColor) #更改界面背景色

    def askcc():
        nonlocal rgbcolor
        myColor = askcolor(getrgbcolor())
        if myColor==(None, None):
            return
        tmps = myColor[1]
        tmps = tmps[1:] #将后面的颜色值取出

        redc   = int(myColor[0][0]) # 设置红色int
        greenc = int(myColor[0][1]) # 设置绿色int
        bluec  = int(myColor[0][2]) # 设置蓝色int
        rgbcolor=(redc, greenc, bluec)
        rSlider.set(redc) #重设
        gSlider.set(greenc)
        bSlider.set(bluec)
        root.config(bg=myColor[1]) # 重设

    def 显示颜色(参数):
        nonlocal rgbcolor
        rgbcolor = 参数
        root.config(bg=RGB_to_Hex(参数)) # 重设
        rSlider.set(参数[0]) #重设
        gSlider.set(参数[1])
        bSlider.set(参数[2])

    rgbcolor=None
    root = Tk()
    root.title("颜色选择")
    root.geometry("604x360")
    root.attributes('-topmost',True) # 设置窗口处于顶层
    root.resizable(width=False,height=False)
    cc = Frame(root)
    cc.pack(side=LEFT, anchor=NW)
    rSlider = Scale(cc, from_=255, to=0, length=354,troughcolor="pink", command=bgUpdate,)
    gSlider = Scale(cc, from_=255, to=0, length=354,troughcolor="lightgreen", command=bgUpdate)
    bSlider = Scale(cc, from_=255, to=0, length=354,troughcolor="lightblue", command=bgUpdate)

    rSlider.pack(side=LEFT)
    gSlider.pack(side=LEFT)
    bSlider.pack(side=LEFT)

    # 添加基本颜色,共6行24列(最后一行是灰度),并通过command 参数设置功能
    buttons=[]
    row = 0
    col = 0
    buttonsFrame = LabelFrame(root,fg='black',text=' 基本颜色 ') #为了规范美观,把以下内容装入容器 LabelFrame 中
    buttonsFrame.pack(anchor='nw',padx=0,ipady=0,side=TOP) # anchor = n, ne, e, se, s, sw, w, nw, or center
    for i1 in (255,192,128,64,0):
        for i2 in (255,192,128,64,0):
            for i3 in (255,192,128,64,0):
                if i1 == i2 ==i3 : continue
                colors = (i1,i2,i3)
                buttons.append(Button(buttonsFrame,bg=RGB_to_Hex(colors),width=1, height=1,command=lambda 参数=colors:显示颜色(参数)).grid(row=row,column=col,padx=1,pady=1))
                col += 1
                if col >23: 
                    row += 1
                    col = 0
    col = 0
    for i in (255,240,232,224,208,200,192,176,168,160,144,136,128,112,96,80,72,64,48,32,24,16,8,0): # 增加灰度
        colors = (i,i,i)
        buttons.append(Button(buttonsFrame,bg=RGB_to_Hex(colors),width=1, height=1,command=lambda 参数=colors:显示颜色(参数)).grid(row=row,column=col,padx=1,pady=1))
        col += 1

    # 添加按钮,以及按钮的文本,并通过command 参数设置功能
    button1 = Button(root,text="确定",width=10, height=1,command=确定)
    button2 = Button(root,text="取消",width=10, height=1,command=取消)
    askBtn  = Button(root, text="调用系统调色板", command=askcc)
    # 将按钮放置在主窗口内
    button1.pack(anchor='s',pady=10,ipady=1,side=LEFT, expand=True)
    button2.pack(anchor='s',pady=10,ipady=1,side=LEFT, expand=True ) # anchor = n, ne, e, se, s, sw, w, nw, or center
    askBtn.pack(anchor='s' ,pady=10,ipady=1,side=LEFT, expand=True)

    root.protocol('WM_DELETE_WINDOW', 取消)  #当点击窗口右上角 X 关闭时执行的程序
    if not (color is None):显示颜色(color)
    root.mainloop()
    return rgbcolor

if __name__ == '__main__':
    print(color_choice())

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

刘庆豪2007

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

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

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

打赏作者

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

抵扣说明:

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

余额充值