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

时间:2016-03-17 16:26:45

标签: python linux tkinter raspberry-pi

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

到目前为止,我已经拥有:一个带有每个通道的开/关按钮的GUI,这会启动或停止pwm输出。 我有一个滑块(比例)耦合到一个输入框,其中pwm值从0变为100,你可以移动滑块或在输入框中输入一个值,它们都会在更改时改变。这也会自动将输出DutyCycle从0更新为100,这样你就可以100步完全调暗通道的颜色,并在移动滑块时看到它变暗。

现在我已经使用了Tkinter.colorchooser模块添加一个按钮,让我在colorpicker中选择一个颜色。 当我选择一种颜色时,模块返回一个由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]

UPDATE2:

我将值分开并放入不同的标签,稍后将是入口箱

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)

现在只需要将其向下舍入

UPDATE3:

现在将每个值向下舍入并将其放入输入框中, 在值之后仍然有.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)

1 个答案:

答案 0 :(得分:1)

  

所有滑块为255,它给出:[100.390625,100.390625,100.390625]

这是打印命令的工件。这意味着您在列表中有一个包含三个值的列表。

如果在一行中打印三个变量,则会得到三个以空格分隔的值

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

您的数学运算正在强制列表的值为浮点数。你想要它作为整数。将它向下舍入时,将整数值放入浮点变量中,这些变量仍然会以最终的.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是浮点数,或者您使用100.0或255.0,那么您将获得浮点结果,以便

>>> 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]
相关问题