一、创作灵感
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())