[英]Python: How to convert a rgb or hex value to single color values
我正在制作一个带有 GUI 的 python 脚本,使用 Tkinter 来控制带有 Raspberry Pi 的 LED 灯条。 条带连接到 mosfets,并连接到 GPIO 端口。
到目前为止,我有:一个带有每个通道开/关按钮的 GUI,这将启动或停止 pwm 输出。 我有一个滑块(比例尺)耦合到一个输入框,其中 pwm 值从 0 更改为 100,您可以移动滑块或在输入框中输入一个值,当更改一个值时,它们都会更改。 这还会自动将输出 DutyCycle 从 0 更新为 100,因此您可以以 100 步完全变暗通道的颜色,并在移动滑块时看到它变暗。
现在我已经使用 Tkinter.colorchooser 模块添加了一个按钮,让我使用内置的颜色选择器来选择一种颜色。 当我选择一种颜色时,模块返回一个由 rgb 值和一个十六进制值组成的元组,如下所示:
{214.8359375 215.83984375 214.8359375} #d6d7d6
我只能采用 rgb 三元组或仅十六进制值并将其放入变量中,但这就是我被卡住的地方。
我的 pwm 电路使用一个没有小数的 0-100 值。 所以我开始只得到 rgb 三元组,然后将其值除以 255,再乘以 100,得到 0-255 到 0-100 的转换。 但它仍然有很多我不需要/不想要的小数。 并且 3 个颜色值只是由空格分隔。
现在我怎样才能把那个三元组转换成 3 个没有小数的独立变量,这样我就可以将每个变量放在所需的输入框中,并使滑块移动并更改 LED 占空比。
我试过拆分元组,但它给了我一些类似预期值更少的东西,但我认为这是因为元组没有逗号
取十六进制值并将其转换为单独的值会更容易吗? 我希望任何人都可以帮助我解决这个问题,我现在有点卡住了。
谢谢你。
更新:
def pickcolor1():
(triple1,hexstr1) = askcolor(initialcolor='#000000')
if triple1:
triple1pwm = [x / 255.0 * 100 for x in triple1]
colorlabel1 = Label(mGui,text=triple1pwm).grid(row=14,column=0,columnspan=34)
pickcolorbutton1 = Button(mGui,text='Pick color',width=1,command=pickcolor1).grid(row=13,column=1,columnspan=4,sticky=W+E)
将颜色选择器的所有滑块设置为 0,它会给出:[0.0, 0.0, 0.0]
所以我还需要删除括号? [ ]
将所有滑块设置为 255,它会给出:[100.390625, 100.390625, 100.390625]
更新2:
我将值分开并放入不同的标签中,稍后将是输入框
def pickcolor1():
(triple1,hexstr1) = askcolor(initialcolor='#000000')
if triple1:
triple1pwm = [x / 255.0 * 100 for x in triple1]
colorlabelr1 = Label(mGui,text=triple1pwm[0]).grid(row=14,column=0,columnspan=34)
colorlabelg1 = Label(mGui,text=triple1pwm[1]).grid(row=15,column=0,columnspan=34)
colorlabelb1 = Label(mGui,text=triple1pwm[2]).grid(row=16,column=0,columnspan=34)
print(triple1pwm[0])
print(triple1pwm[1])
print(triple1pwm[2])
pickcolorbutton1 = Button(mGui,text='Pick color',width=1,command=pickcolor1).grid(row=13,column=1,columnspan=4,sticky=W+E)
这工作现在只需要四舍五入
更新3:
现在将每个值向下舍入并将其放入输入框中,该值后仍为 .0。
def pickcolor1():
(triple1,hexstr1) = askcolor(initialcolor='#000000')
if triple1:
triplepwm1 = [x // 2.55 for x in triple1]
pwmr1 = StringVar()
pwmg1 = StringVar()
pwmb1 = StringVar()
pwmr1.set(triplepwm1[0])
pwmg1.set(triplepwm1[1])
pwmb1.set(triplepwm1[2])
pickentryr1 = Entry(mGui,textvariable=pwmr1).grid(row=14,column=0,columnspan=34)
pickentryg1 = Entry(mGui,textvariable=pwmg1).grid(row=15,column=0,columnspan=34)
pickentryb1 = Entry(mGui,textvariable=pwmb1).grid(row=16,column=0,columnspan=34)
print(triplepwm1[0])
print(triplepwm1[1])
print(triplepwm1[2])
pickbutton1 = Button(mGui,text='Pick color',width=1,command=pickcolor1).grid(row=13,column=1,columnspan=4,sticky=W+E)
将所有滑块设置为 255,它会给出:[100.390625, 100.390625, 100.390625]
这是打印命令的产物。 这意味着您有一个列表,其中包含三个值。
如果在一行中打印三个变量,您将得到三个由空格分隔的值
>>> print r, g, b
100.390625 100.390625 100.390625
您的数学正在迫使列表的值变为浮点数。 你希望它是整数。 当你把它四舍五入时,你将整数值放入浮点变量中,这些变量仍然会输出最终的 .0 Change
triple1pwm = [x / 255.0 * 100 for x in triple1]
到
triple1pwm = [int(x*100/255) for x in triple1]
这将向下舍入为整数值。
你也可以使用
triple1pwm = [x*100//255 for x in triple1]
这是因为您拥有的操作顺序
>>> 25 // 255 * 100
0
>>> 25 * 100 // 255
9
请注意,只要 x 是浮点数或者您使用 100.0 或 255.0,那么您将获得浮点结果,以便
>>> 25.0 * 100 // 255
9.0
尽管
>>> int(25.0 * 100 / 255)
9
现在你可以说
r, g, b = 三重1pwm
或者
r, g, b = [int(x*100/255) for x in triple1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.