日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python 實(shí)現(xiàn)一個(gè)顏色色值轉(zhuǎn)換的小工具

系統(tǒng) 1853 0

需求說明

  公司的 UI 設(shè)計(jì)小哥,已經(jīng)轉(zhuǎn)用 Zeplin 很久了。Zeplin 的設(shè)計(jì)稿展示頁面的顏色色值使用十進(jìn)制的 RGB 表示的,在 Android 中的顏色表示大多情況下都需要十六進(jìn)制的 RGB 表示。我的數(shù)學(xué)沒有好到直接看到十進(jìn)制就可以心算得到十六進(jìn)制的結(jié)果,所以我需要一個(gè)工具,輸入十進(jìn)制的 RGB ,得到十六進(jìn)制的色值,最好可以方便復(fù)制。

Python 實(shí)現(xiàn)一個(gè)顏色色值轉(zhuǎn)換的小工具_(dá)第1張圖片

?Zeplin 的顏色色值顯示示例

原有處理方式

  因?yàn)槲視?huì) Python (僅限于終端輸入 python 然后當(dāng)做計(jì)算器算,或者用 hex() 函數(shù)把十進(jìn)制轉(zhuǎn)換成十六進(jìn)制),所以遇到這樣的問題我當(dāng)然是采用python 的 hex() 函數(shù)做轉(zhuǎn)換,然后手動(dòng)結(jié)果輸入到 Android Studio 中。

Python 實(shí)現(xiàn)一個(gè)顏色色值轉(zhuǎn)換的小工具_(dá)第2張圖片

采用 hex 函數(shù)手動(dòng)轉(zhuǎn)換色值

動(dòng)機(jī)

  人總是懶得,想要寫這個(gè)小工具已經(jīng)很久了,我也打過有過構(gòu)思就是:

  輸入: 類似 RGB 的十進(jìn)制值(110, 122 138),用空格或者逗號分割一下。

  輸出: 一個(gè)十六進(jìn)制的 RGB 顏色色值(#6e7a8a)。

  但就一直沒動(dòng)手,一直講究著。真懶!

開干

1.首先我需要輸入函數(shù)

  我打開我之前學(xué)習(xí) Python 的文件夾,里面正好有一個(gè) raw_input 的示例:

Python代碼

            
#!/usr/bin/python 

#coding=utf-8 

 

raw_input("\n\n等輸入") 

          

  在終端執(zhí)行 python input.py 后, 可以輸入文字。

  我需要接受到用戶輸入的信息。怎么接收忘記了, Google 之,得到結(jié)果,順便改改輸入提示語,打印出輸入的內(nèi)容:

Python代碼

            
input = raw_input("\n輸入顏色 比如50 144 60:\n") 
print(input) 
          

2. 需要分割字符

  查詢到python 字符分割函數(shù) split(),默認(rèn)不傳入?yún)?shù)就可以用空白符分割。原本還說用英文逗號(,)作為分隔符,現(xiàn)在看來可以省了,直接用空格分割,無論多少空格都可以自動(dòng)分割。于是加上代碼:

Python代碼

            
rgbColorArray = input.split() 
print(rgbColorArray)
          

?   3. 需要遍歷數(shù)組

  簡單的遍歷數(shù)組的是怎么弄的也忘記了,同樣搜索:

Python代碼

            
for x in rgbColorArray: print(x) 
          

4. 字符轉(zhuǎn)成十六進(jìn)制

  這個(gè)時(shí)候拿到了字符串,要變成十六進(jìn)制的字符串。這個(gè)時(shí)候需要兩個(gè)函數(shù), int() 和 hex(),int 函數(shù)可以將字符串轉(zhuǎn)成 int 類型,而 hex 則接受數(shù)字參數(shù),返回字符串。 0x開始的字符串。

  于是就有了版的。

于是就有了第一個(gè)版本。

  第一個(gè)版本

Python 實(shí)現(xiàn)一個(gè)顏色色值轉(zhuǎn)換的小工具_(dá)第3張圖片

第一個(gè)版本

Python 實(shí)現(xiàn)一個(gè)顏色色值轉(zhuǎn)換的小工具_(dá)第4張圖片

第一個(gè)版本執(zhí)行結(jié)果

  寫出這樣的基礎(chǔ)版本已經(jīng)基本可以得到我想要的結(jié)果了,缺點(diǎn)是還需要我手動(dòng)收入,動(dòng)用大腦記憶十六進(jìn)制色值然后輸入。希望可以直接復(fù)制最后結(jié)果。

  再進(jìn)一步

  雖然結(jié)果已經(jīng)出來了,但是還是希望可以在進(jìn)步一些,有幾個(gè)問題:

  1. 當(dāng)要轉(zhuǎn)換的數(shù)字小于16的時(shí)候 只有一位不顯示,比如11 顯示的結(jié)果是0xB

  2. 現(xiàn)實(shí)的結(jié)果多了0x

  3. 顯示的結(jié)果最好連在一起方便復(fù)制,而不是每個(gè)顏色一行。

  那么就需要遍歷顏色值數(shù)組,去掉0x 字符串, 判斷小于16的前面補(bǔ)上0。連續(xù)在一起輸出結(jié)果。

  for 循環(huán)遍歷數(shù)組

  前面用到了 for 循環(huán),是從查到的范例,不過多行就不知道怎么弄了。java 寫多了一般都是 { } 大括號括起來。

  繼續(xù)查資料,于是知道是大概下面這樣的用法。

Python代碼

            
#!/usr/bin/python 
# -*- coding: UTF-8 -*- 
 
for num in range(10,20): # 迭代 10 到 20 之間的數(shù)字 
 for i in range(2,num): # 根據(jù)因子迭代 
  if num%i == 0:  # 確定第一個(gè)因子 
   j=num/i   # 計(jì)算第二個(gè)因子 
   print '%d 等于 %d * %d' % (num,i,j) 
   break   # 跳出當(dāng)前循環(huán) 
 else:     # 循環(huán)的 else 部分 
  print num, '是一個(gè)質(zhì)數(shù)' 

          

  變量聲明

  由于需要不換行,所以就需要字符連接,而不是直接 print。

  聲明變量又遇到問題了。根據(jù)前面的變量使用情況,找了些 python 代碼看了看,大概知道不用聲明什么類型,直接用就好了。于是有了代碼:

Python代碼

            
output = "#" 
for x in rgbColorArray: 
 intx = int(x) 
 output = output + hex(intx) 
print(output) 

          

  字符串裁剪和拼接

  需要把多余的0x 兩位去掉。

  用到字符串裁剪,依然尋找范例。

Python代碼

            
#!/usr/bin/python 
 
var1 = 'Hello World!' 
var2 = "Python Runoob" 
 
print "var1[0]: ", var1[0] 
print "var2[1:5]: ", var2[1:5] 

          

  這個(gè)范例的執(zhí)行結(jié)果:

Python代碼

            
var1[0]: H 
var2[1:5]: ytho 

          

  順便問了旁邊也在學(xué)習(xí) python 的同事,他告訴我后面的索引可以省略,代表直接裁剪到結(jié)尾。

  比如上面的例子如果 print "var2[1:]", var2[1:] 得到的結(jié)果應(yīng)該是 ython Runoob

  所以有代碼:

Python代碼

            
output = "#" 
for x in rgbColorArray: 
 intx = int(x) 
 output = output + hex(intx)[2:] 
print(output) 

          

  也可以從后往前數(shù),比如還是上面的范例可以寫成。比如上面的例子如果 print "var2[-1:]", var2[-1:] 得到的結(jié)果應(yīng)該是 ob 也就是字符串的后兩位。

  于是我們這里可以寫成hex(intx)[-2:] (因?yàn)檩敵鲎址愃剖?x23, 這樣的)就是這個(gè)導(dǎo)致我后面寫了個(gè) bug,我也文章最后說明這個(gè) bug 是什么。

  if else 判斷

  接著要做一個(gè)判斷,給一位的補(bǔ)上0

Python代碼

            
if intx < 16: 
 output = output + '0' + hex(intx)[-2:] 
else: 
 output = output + hex(intx)[-2:] 

          

  這樣就有了python 文件:

Python代碼

            
#!/usr/bin/python 
#coding=utf-8 
 
input = raw_input("\n輸入顏色 比如50 144 60:\n") 
#print(input) 
 
rgbColorArray = input.split() 
print(rgbColorArray) 
 
output = "#" 
for x in rgbColorArray: 
 intx = int(x) 
 if intx < 16: 
  output = output + '0' + hex(intx)[-2:] 
 else: 
  output = output + hex(intx)[-2:]  
#print(hex(int(x))) 
print(output) 

          

  還有最后一步:把 ColorU 加入到環(huán)境變量中

  這個(gè)時(shí)候我可以得到我要的記過了,但是有點(diǎn)不太方便,我需要到這個(gè) python 文件所在的目錄下寫

Python代碼

            
python colorU.py 
          

  或者寫全 colorU.py 這個(gè)路徑。都是很麻的事情,所以我需要把 colorU 加入環(huán)境變量中。我用的是 zsh,所以找到環(huán)境變量的配置文件:~/.zshrc,末尾加上配置:

Python代碼

            
alias colorU="python ~/Documents/Development/PythonStudy/colorU.py" 

          

  這個(gè)是經(jīng)過另外以為同事指導(dǎo)后的最后可行版本,我最初的思路是把 colorU.py 文件設(shè)置成可執(zhí)行文件,然后加入到 Path 當(dāng)中。結(jié)果我把 colorU.py 這個(gè)文件的地址加入到了 Path 中,世界上PATH 應(yīng)該是一個(gè)目錄。這樣添加別名的方式更方便。

也就是說如果我裝客戶端就可以不用我寫的這個(gè)腳本了。但沒關(guān)系我學(xué)習(xí)了 python,寫了我自己的第一個(gè)真正有用的 python 代碼。

  2. 一個(gè)bug:我是在寫這篇文章的時(shí)候才發(fā)現(xiàn)這個(gè) bug 的,類似0x33這樣的字符串從后往前裁剪的時(shí)候?qū)慬-2:],當(dāng)然沒有問題,但是寫0xf 這樣的字符串就會(huì)有問題了。程序輸入 5 5 5得到的結(jié)果是 #0x50x50x5。修改成[2:] 的裁剪就可以了。

Python 實(shí)現(xiàn)一個(gè)顏色色值轉(zhuǎn)換的小工具_(dá)第5張圖片

倒向裁剪字符串引起的bug

  還可以繼續(xù)升級體驗(yàn):

  a. 直接在終端中輸入 colorU 231 234 123 就可以得到結(jié)果 #e7ea7b;

  b. 配合Alfred, 呼出 Alfred 窗口后,輸入色值,得到結(jié)果,回車直接復(fù)制十六進(jìn)制到粘貼板。

  c. 保存之前已經(jīng)轉(zhuǎn)換過的色值,方便重復(fù)使用的顏色,直接復(fù)制十六進(jìn)制顏色。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 尚义县| 夏津县| 措美县| 旬邑县| 锡林浩特市| 蒙城县| 利辛县| 芒康县| 梁平县| 青阳县| 冕宁县| 崇左市| 盘山县| 山丹县| 许昌县| 新晃| 泸西县| 芦溪县| 双辽市| 绥宁县| 从江县| 沈阳市| 十堰市| 云南省| 前郭尔| 日喀则市| 萨迦县| 东源县| 德格县| 贵德县| 新和县| 凉山| 靖远县| 正蓝旗| 台中市| 宁强县| 奉化市| 山丹县| 长泰县| 准格尔旗| 桂平市|