簡體   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