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