在開(kāi)始寫(xiě)代碼之前,先分析程序需要實(shí)現(xiàn)的功能。一個(gè)簡(jiǎn)易的畫(huà)圖板應(yīng)該有取色器、畫(huà)筆工具、直線工具、矩形工具、圓形工具、一鍵清除這六項(xiàng)基本功能。做這個(gè)程序只需用到Canvas和Button兩種控件。Python 提供了多個(gè)圖形開(kāi)發(fā)界面的庫(kù),Tkinter、wxPython、Jython都是常用Python GUI 庫(kù)。Tkinter是一個(gè)輕量級(jí)的跨平臺(tái)圖形用戶界面(GUI)開(kāi)發(fā)工具,是Python自帶的官方標(biāo)準(zhǔn)庫(kù),安裝Python 之后直接導(dǎo)入就可以使用, 我們常見(jiàn)的Python IDLE就是使用Tkinter實(shí)現(xiàn)的。需要用到的函數(shù)及函數(shù)用法如下表:
這里使用了網(wǎng)格布局方式的grid布局管理器,簡(jiǎn)便易用。首先,用import導(dǎo)入Tkinter模塊及colorchooser函數(shù)。
然后設(shè)置窗口標(biāo)題及背景顏色并創(chuàng)建六個(gè)功能按鈕,并設(shè)置row(行)值為0,column(列)值依次增加以將六個(gè)按鈕放在第0行的不同列上。接著在第1行創(chuàng)建一個(gè)Canvas畫(huà)布控件。并且將columnspan值設(shè)為6以對(duì)0~5列進(jìn)行合并。這樣Canvas組件就占了6列,有了足夠的寬度。
代碼如圖1。
運(yùn)行效果如圖2。
接下來(lái)我們開(kāi)始給這些按鈕編寫(xiě)功能。首先寫(xiě)出六個(gè)按鈕的事件響應(yīng)函數(shù),并進(jìn)行綁定。
這里我們聲明了兩個(gè)全局變量:一個(gè)是Shape,用于儲(chǔ)存當(dāng)前工具所繪制的形狀;另一個(gè)是color,用于儲(chǔ)存當(dāng)前顏色的十六進(jìn)制顏色值。
在取色器事件響應(yīng)函數(shù)中,我們使用了askcolor函數(shù)。在使用askcolor函數(shù)時(shí),用戶選取顏色點(diǎn)擊確定后的返回值是一個(gè)元組,元組中下標(biāo)為0的元素是一個(gè)元組(R,G,B),表示用戶選取顏色的RGB值,下標(biāo)為1的元素是所選顏色的十六進(jìn)制值。
在畫(huà)筆、矩形、直線、圓形工具的事件響應(yīng)函數(shù)中,我們只需要將全局變量Shape設(shè)置成代表形狀的相應(yīng)字符串就行了(注:p代表畫(huà)筆,l代表直線,r代表矩形,c代表圓形)。
在一鍵清除事件響應(yīng)函數(shù)中,我們用Canvas的delete(ALL)函數(shù)刪除畫(huà)布的所有內(nèi)容。
寫(xiě)完函數(shù)之后,我們把這幾個(gè)按鈕的事件響應(yīng)函數(shù)和左鍵單擊按鈕的事件2.畫(huà)布功能實(shí)現(xiàn)
然后我們?cè)贑anvas上寫(xiě)繪制圖形的核心代碼。經(jīng)過(guò)分析,我們?cè)诋?huà)板上畫(huà)圖時(shí)一般分為三個(gè)階段——落筆(按下鼠標(biāo)左鍵)、繪制(按住鼠標(biāo)左鍵并移動(dòng))、抬筆(松開(kāi)鼠標(biāo)左鍵)。
而我們?cè)谔幚砭匦?、圓形、直線操作時(shí),只需要在落筆時(shí)記錄起始點(diǎn)的坐標(biāo)prevX及抬筆時(shí)終止點(diǎn)的坐標(biāo)prevY,再用畫(huà)布的函數(shù)繪制相應(yīng)圖形就行了。因此我們就把這三個(gè)工具負(fù)責(zé)繪制相關(guān)功能的函數(shù)都合在了落筆函數(shù)pen_down和抬筆函數(shù)pen_up里面,代碼如圖4。
但是畫(huà)筆工具就沒(méi)這么容易了,畫(huà)筆工具需要實(shí)時(shí)繪制,即鼠標(biāo)到哪兒筆跡就到哪兒。所以我們需要(在使用畫(huà)筆工具時(shí))按下鼠標(biāo)就不斷地繪制點(diǎn),這樣就可以做到實(shí)時(shí)繪制了。
不過(guò)問(wèn)題又來(lái)了,Canvas中并沒(méi)有繪制點(diǎn)的坐標(biāo)。所以我們需要用繪制直線的函數(shù)create_line并將起始點(diǎn)坐標(biāo)和終止點(diǎn)坐標(biāo)都設(shè)為當(dāng)前鼠標(biāo)的坐標(biāo),這樣就可以在鼠標(biāo)走過(guò)的地方留下小點(diǎn)了,點(diǎn)動(dòng)成線就有了筆跡。最后把畫(huà)筆繪制的函數(shù)draw和按下鼠標(biāo)左鍵不放并拖動(dòng)的事件
還需要注意的是,在draw函數(shù)里,務(wù)必要判斷當(dāng)前的工具是不是畫(huà)筆,不然在使用其他工具時(shí)也會(huì)在鼠標(biāo)后面出現(xiàn)一條筆跡。
至此,畫(huà)圖板所有的代碼都完成了,接下來(lái)運(yùn)行測(cè)試,修改Bug。簡(jiǎn)易畫(huà)圖板就實(shí)現(xiàn)了(圖5)!
9885F23B-6D7E-47AB-B894-04C86496F1B7