Kivy 中文教程 實(shí)例入門 簡(jiǎn)易畫板 (Simple Paint App):3. 隨機(jī)顏色及清除按鈕

1. 隨機(jī)顏色

通過前面的教程誓篱,咪博士已經(jīng)帶大家實(shí)現(xiàn)了畫板的繪圖功能朋贬。但是,現(xiàn)在畫板只能畫出黃色的圖案窜骄,還十分單調(diào)锦募,接下來咪博士就教大家,如何使用隨機(jī)顏色邻遏,讓畫板變得五彩斑斕糠亩。

改進(jìn)后的代碼如下:

from random import random
 
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse, Line
 
 
class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        color = (random(), random(), random())
        with self.canvas:
            Color(*color)
            d = 30.
            Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d))
            touch.ud['line'] = Line(points=(touch.x, touch.y))
 
    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]
 
 
class MyPaintApp(App):
    def build(self):
        return MyPaintWidget()
 
 
if __name__ == '__main__':
    MyPaintApp().run()

試試看。怎么樣准验?是不是好看多了呢赎线?

image

第 1 行 from random import random 我們導(dǎo)入了隨機(jī)函數(shù) random,它可以產(chǎn)生 [0, 1) 之間的隨機(jī)數(shù)

第 10 行 color = ( random () , random () , random () ) 通過調(diào)用 random 函數(shù)糊饱,產(chǎn)生隨機(jī)的 RGB 分量垂寥,存儲(chǔ)在元組 color 中。后面(第 12 行),我們會(huì)用隨機(jī)的 RGB 分量合成隨機(jī)的顏色滞项。注意狭归,第 10 行的代碼位于 on_touch_down 函數(shù)內(nèi)。所以文判,用戶每次點(diǎn)擊鼠標(biāo)的時(shí)候过椎,都會(huì)生成新的隨機(jī) RGB 分量。

第12 行戏仓,用前面(第 10 行)產(chǎn)生的隨機(jī) RGB 分量生成隨機(jī)顏色 color疚宇。函數(shù) Color 需要授受 3 個(gè)參數(shù)(分別表示 RGB 的 3 個(gè)分量)。這里的 Color (* color) 表示將元組 color 解包赏殃,傳遞給函數(shù) Color敷待。由于元組 color 包含 3 個(gè)元素,所以它解包之后仁热,就產(chǎn)生了 3 個(gè)隨機(jī)數(shù)讼撒,而這 3 個(gè)隨機(jī)數(shù)恰好可以做為 RGB 的 3 個(gè)分量傳遞給函數(shù) Color。

不過股耽,由于現(xiàn)在的顏色是完全隨機(jī)的,程序有時(shí)候會(huì)產(chǎn)生一些比較暗的顏色钳幅,在黑色的畫板背景上顯示效果不是很好物蝙。我們可以進(jìn)一步限制隨機(jī)顏色的取值范圍,讓它只取一些比較鮮亮的顏色敢艰。

from random import random
 
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse, Line
 
 
class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        color = (random(), 1, 1)
        with self.canvas:
            Color(*color, mode='hsv')
            d = 30.
            Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d))
            touch.ud['line'] = Line(points=(touch.x, touch.y))
 
    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]
 
 
class MyPaintApp(App):
    def build(self):
        return MyPaintWidget()
 
 
if __name__ == '__main__':
    MyPaintApp().run()

試試調(diào)整后的代碼诬乞。哇!頓時(shí)鮮艷多了钠导。

image

第 10 行 color = ( random () , 1 , 1 ) 我們將隨機(jī)顏色的后 2 個(gè)分量固定為 1震嫉,只讓第 1 個(gè)分量隨機(jī)變化。

第 12 行 Color (* color , mode='hsv') 我們用 mode=’hsv’牡属,指定顏色采用 HSV 模式票堵,而不是先前默認(rèn)的 RGB 模式。HSV 色彩模式的 3 個(gè)參數(shù)逮栅,分別代表 色調(diào)(Hue)悴势、飽和度(Saturation)、明度(Value)措伐。色調(diào)(Hue) 表示不同的色調(diào)(色彩的種類和名稱)特纤;飽和度(Saturation) 越高,則顏色越深侥加、越艷捧存;明度(Value)表示顏色的明度程度。由于采用了 HSV 色彩模式,第 10 行代碼產(chǎn)生的隨機(jī)元組 color 的含義也要相應(yīng)發(fā)生變化了昔穴。color 中的第 1 參數(shù)是一個(gè)隨機(jī)數(shù)镰官,表示隨機(jī)選擇不同的色彩種類;第 2 個(gè)參數(shù)傻咖,固定為 1朋魔,表示取最大的飽和度,即將顏色調(diào)到最深卿操、最艷警检;第 3 個(gè)參數(shù),也固定取 1害淤,表示將顏色調(diào)到最亮扇雕。這樣改進(jìn)之后,程序就只會(huì)生成明亮的隨機(jī)顏色了窥摄。

2. 清除按鈕

最后镶奉,我們要在畫板上添加一個(gè)清除按鈕,這樣用戶不必重啟程序崭放,就能將畫板清空哨苛,并繪制新的圖形。

完整代碼如下:

from random import random
 
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.graphics import Color, Ellipse, Line
 
 
class MyPaintWidget(Widget):
    def on_touch_down(self, touch):
        color = (random(), 1, 1)
        with self.canvas:
            Color(*color, mode='hsv')
            d = 30.
            Ellipse(pos=(touch.x - d / 2, touch.y - d / 2), size=(d, d))
            touch.ud['line'] = Line(points=(touch.x, touch.y))
 
    def on_touch_move(self, touch):
        touch.ud['line'].points += [touch.x, touch.y]
 
 
class MyPaintApp(App):
    def build(self):
        parent = Widget()
        self.painter = MyPaintWidget()
        clearbtn = Button(text='Clear')
        clearbtn.bind(on_release=self.clear_canvas)
        parent.add_widget(self.painter)
        parent.add_widget(clearbtn)
        return parent
 
    def clear_canvas(self, obj):
        self.painter.canvas.clear()
 
 
if __name__ == '__main__':
    MyPaintApp().run()

點(diǎn)擊左下角的清除(Clear)按鈕币砂,可以將畫板的內(nèi)容清空建峭。

image

第 5 行 from kivy.uix.button import Button 導(dǎo)入 Button 類。窗體左下角的清除 (Clear) 按鈕决摧,便是 Button 類的實(shí)例亿蒸。

第 24 行 parent = Widget () 創(chuàng)建一個(gè)空的窗口部件 (Widget)。后面我們會(huì)將自定義窗口部件(畫板 MyPaintWidget)以及清除按鈕(Button)添加到 parent 上掌桩。注意:Kivy 中進(jìn)行窗口部件編排的標(biāo)準(zhǔn)做法是使用布局( layout)边锁。咪博士這里用的是比較便捷(但不規(guī)范)的方法,為的是讓大家快速完成簡(jiǎn)易畫板這個(gè)項(xiàng)目波岛。關(guān)于 Kivy 中布局(layout)的使用茅坛,咪博士將在其他的教程中專門講解。

第25 行 self.painter = MyPaintWidget() 創(chuàng)建自定義窗口部件對(duì)象则拷,并賦值給變量 self.painter灰蛙。因?yàn)椋竺嫖覀冞€要在別的函數(shù)中引用它隔躲。

第 26 行 clearbtn = Button (text='Clear') 創(chuàng)建清除按鈕對(duì)象摩梧,將按鈕的文字設(shè)置為 Clear,并賦值給變量 clearbtn。

第 27 行 clearbtn.bind (on_release=self.clear_canvas) 將清除按鈕的 on_release 事件綁定 (bind) 到 self.clear_canvas 方法(第 32, 33 行)。這樣鲸阔,當(dāng)用戶按下并釋放清除按鈕時(shí)楣责,將觸發(fā)按鈕的 on_release 事件永票,然后調(diào)用該事件所綁定的 self.clear_canvas 方法仔沿,執(zhí)行清除畫板的動(dòng)作痴鳄。

第 28, 29 行柏卤,將自定義窗口部件對(duì)象(self.painter)和清除按鈕對(duì)象(clearbtn)添加到 parent 窗口部件中省容。

第 30 行 return parent 返回 parent 窗口部件抖拴。注意,此時(shí)的 parent 已經(jīng)包含了自定義窗口部件對(duì)象(self.painter)和清除按鈕對(duì)象(clearbtn)腥椒。

第 32, 33 行阿宅,是用戶按下并釋放清除按鈕時(shí)觸發(fā)的回調(diào)函數(shù)。清除畫板的功能正是通過第 33 行 self.painter.canvas.clear() 實(shí)現(xiàn)的笼蛛。

好啦洒放,到此為止 Kivy 簡(jiǎn)易畫板的項(xiàng)目就全部完成啦。請(qǐng)關(guān)注咪博士后續(xù)更加精彩的 Kivy 教程滨砍。

原文鏈接:http://www.ipaomi.com/2017/11/20/kivy-中文教程-實(shí)例入門-簡(jiǎn)易畫板-simple-paint-app:3-隨機(jī)顏色及清/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末往湿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惋戏,更是在濱河造成了極大的恐慌领追,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件响逢,死亡現(xiàn)場(chǎng)離奇詭異蔓腐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)龄句,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來散罕,“玉大人分歇,你說我怎么就攤上這事∨肥” “怎么了职抡?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長误甚。 經(jīng)常有香客問我缚甩,道長,這世上最難降的妖魔是什么窑邦? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任擅威,我火速辦了婚禮,結(jié)果婚禮上冈钦,老公的妹妹穿的比我還像新娘郊丛。我一直安慰自己,他們只是感情好厉熟,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布导盅。 她就那樣靜靜地躺著,像睡著了一般揍瑟。 火紅的嫁衣襯著肌膚如雪白翻。 梳的紋絲不亂的頭發(fā)上滤馍,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音纯续,去河邊找鬼。 笑死倦炒,一個(gè)胖子當(dāng)著我的面吹牛软瞎,可吹牛的內(nèi)容都是我干的涤浇。 我是一名探鬼主播著恩,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼纵顾,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了贞盯?” 一聲冷哼從身側(cè)響起躏敢,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤件余,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枪蘑,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年悲立,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薪夕。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡熏纯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叮盘,到底是詐尸還是另有隱情丙唧,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站侧甫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窃款。 院中可真熱鬧晨继,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽菇曲。三九已至喊式,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工项钮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留希停,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓脾还,卻偏偏與公主長得像鄙漏,于是被迫代替她去往敵國和親椅野。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鳄橘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容