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

1. 隨機(jī)顏色

通過(guò)前面的教程,咪博士已經(jīng)帶大家實(shí)現(xiàn)了畫板的繪圖功能。但是,現(xiàn)在畫板只能畫出黃色的圖案,還十分單調(diào),接下來(lái)咪博士就教大家,如何使用隨機(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 () ) 通過(guò)調(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。

不過(guò),由于現(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ù)。清除畫板的功能正是通過(guò)第 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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 178,486評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 63,852評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 55,944評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 43,108評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 35,205評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 36,537評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評(píng)論 2 379

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