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