繁体   English   中英

Python:如何将 rgb 或十六进制值转换为单色值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM