gpt4 book ai didi

Python:如何将 rgb 或 hex 值转换为单一颜色值

转载 作者:太空狗 更新时间:2023-10-29 12:28:04 25 4
gpt4 key购买 nike

我正在制作一个带有 GUI 的 python 脚本,使用 Tkinter 来控制带有 Raspberry Pi 的 LED 灯条。 strip 连接到 mosfets,它们连接到 GPIO 端口。

到目前为止,我有:一个 GUI,每个 channel 都有开/关按钮,这可以启动或停止 pwm 输出。我有一个 slider (刻度)耦合到一个输入框,其中 pwm 值从 0 更改为 100,您可以移动 slider 或在输入框中输入一个值,当更改一个时它们都会改变。这还会自动将输出 DutyCycle 从 0 更新到 100,因此您可以以 100 步完全调暗 channel 的颜色,并在您移动 slider 时看到它变暗。

现在我已经使用 Tkinter.colorchooser 模块添加了一个按钮,让我可以使用内置的颜色选择器来选择颜色。当我选择一种颜色时,该模块返回一个由 rgb 值和一个十六进制值组成的元组,如下所示:

{214.8359375 215.83984375 214.8359375} #d6d7d6

我只能获取 rgb 三元组或十六进制值并将其放入变量中,但这就是我卡住的地方。

我的 pwm 电路使用 0-100 的值,没有小数。所以我开始只获取 rgb 三元组并将其值除以 255 再乘以 100 得到 0-255 到 0-100 的转换。但它仍然有很多我不需要/不想要的小数。并且 3 个颜色值仅由空格分隔。

现在我如何获取那个三元组并将其转换为 3 个不带小数的独立变量,这样我就可以将每个变量放入其所需的输入框中并使 slider 移动并更改 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)

将颜色选择器的所有 slider 设置为 0,它会给出:[0.0, 0.0, 0.0]

所以我还需要去掉括号? [ ]

所有 slider 都为 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)

最佳答案

with all sliders to 255 it gives: [100.390625, 100.390625, 100.390625]

这是打印命令的产物。这意味着您有一个列表,列表中包含三个值。

如果在一行中打印三个变量,您将得到三个由空格分隔的值

>>> print r, g, b
100.390625 100.390625 100.390625

您的数学运算将列表的值强制为 float 。你想要它作为整数。当你向下舍入时,你将整数值放入浮点变量中,这些变量仍然会随着最终的 .0 变化输出

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 是 float ,或者您使用 100.0 或 255.0,那么您将得到一个 float 结果,这样

>>> 25.0 * 100 // 255
9.0

同时

>>> int(25.0 * 100 / 255)
9

现在你可以说

r, g, b = triple1pwm

r, g, b = [int(x*100/255) for x in triple1]

关于Python:如何将 rgb 或 hex 值转换为单一颜色值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36066360/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com