周春吟
(三亞城市職業(yè)學(xué)院,海南 三亞 572022)
Python 語(yǔ)言是一種解釋型的高級(jí)程序設(shè)計(jì)語(yǔ)言[1]。由荷蘭計(jì)算機(jī)科學(xué)家Guido van Rossum(吉多·范羅蘇姆)于1989 年12 月開(kāi)始設(shè)計(jì)并領(lǐng)導(dǎo)開(kāi)發(fā), 1990 年推出。2010 年,Python2.x 系列發(fā)布了最后一版,其主版本號(hào)為2.7,用于終結(jié)2.x 系列版本的發(fā)展,并且不再進(jìn)行重大改進(jìn)。2008 年12 月,Python3.0 正式發(fā)布。Python3.0版本在語(yǔ)法層面和解釋器內(nèi)部做了很多重大改進(jìn),解釋器內(nèi)部采用完全面向?qū)ο蟮姆绞綄?shí)現(xiàn)。這些重要修改所付出的代價(jià)是3.x 系列版本代碼無(wú)法向下兼容Python 2.0 系列的既有語(yǔ)法,因此,所有基于Python2.0 系列版本編寫(xiě)的庫(kù)函數(shù)都必須修改后才能被Python3.0 系列解釋器運(yùn)行?!癙ython2.x 已經(jīng)是遺產(chǎn),Python3.x 是這個(gè)語(yǔ)言的現(xiàn)在和未來(lái)”。
(1) 簡(jiǎn)單語(yǔ)法:與傳統(tǒng)的C/C++、Java、C#等語(yǔ)言相比,Python 對(duì)代碼格式的要求不那么嚴(yán)格,實(shí)現(xiàn)了相同的功能,Python 中的代碼行數(shù)僅為其他語(yǔ)言的1/10~1/5[2]。這種松散性允許用戶更輕松地編寫(xiě)代碼,而無(wú)需在細(xì)節(jié)上花費(fèi)太多精力。
(2) Python 是開(kāi)源的:首先,程序員用Python 編寫(xiě)的代碼是開(kāi)源的。我們使用Python 開(kāi)發(fā)系統(tǒng)。用戶可以下載系統(tǒng)的源代碼,并且可以隨意修改。這也是解釋型語(yǔ)言本身的特性,要運(yùn)行程序,需要源代碼。第二,Python解釋器和模塊的代碼是正式開(kāi)源的,希望用戶能夠參與其中,共同提高Python 的性能,彌補(bǔ)之前的漏洞。代碼研究得越多,它就越強(qiáng)。
(3) 通用且靈活:Python 是一種通用編程語(yǔ)言,可用于編寫(xiě)各種領(lǐng)域的應(yīng)用程序,這為該語(yǔ)法提供了廣闊的應(yīng)用空間。幾乎所有類型的應(yīng)用程序,從圖像處理、科學(xué)計(jì)算、數(shù)據(jù)處理到人工智能、Python 語(yǔ)言都可以發(fā)揮重要作用[3]。
(4) Python 具有高度的可擴(kuò)展性:Python 的可擴(kuò)展性主要體現(xiàn)在模塊上。Python 模塊具有豐富的腳本語(yǔ)言和強(qiáng)大的庫(kù)。這些庫(kù)或模塊涵蓋了圖形界面編程、網(wǎng)絡(luò)編程和文件操作等應(yīng)用場(chǎng)景。Python 中某些類庫(kù)的底層代碼不一定是Python,并且存在C/C++語(yǔ)言,當(dāng)Python需要提高運(yùn)行速度時(shí),可以使用C/C++語(yǔ)言實(shí)現(xiàn),Python將再次調(diào)用它們,Python 依靠其良好的可擴(kuò)展性在一定程度上彌補(bǔ)了運(yùn)行時(shí)效率的低下。
(5) 豐富的類庫(kù):Python 解釋器提供了數(shù)百個(gè)內(nèi)置類和函數(shù)庫(kù)。此外,世界各地的程序員通過(guò)開(kāi)源社區(qū)貢獻(xiàn)了數(shù)十萬(wàn)個(gè)第三方函數(shù)庫(kù),幾乎涵蓋了計(jì)算機(jī)技術(shù)的所有領(lǐng)域,編寫(xiě)Python 程序可以充分利用現(xiàn)有的內(nèi)置或第三方代碼[4]。
3.1.1 常用設(shè)計(jì)圖形界面的模
Python 有多種用于設(shè)計(jì)圖形用戶界面的模塊,常用的模塊有如下幾種:
Tkinter:使用Tk 平臺(tái),Python 系統(tǒng)自帶的標(biāo)準(zhǔn)圖形用戶界面庫(kù)。
Wxpython:基于wxWindows,具有跨平臺(tái)的特性。
PythonWin:只能在Windows 上使用,使用了本機(jī)的
Windows GUI 功能。
JavaSwing:只能用于Jython,使用本機(jī)的Java GUI。
PyGTK:使用GTK 平臺(tái),在linux 上很流行。
PyQt:使用Qt 平臺(tái),跨平臺(tái)。
3.1.2 tkinter 模塊
使用tkinter 模塊的基本步驟如下:
(1) 導(dǎo)入tkinter 模塊
例如:import tkinter 或from tkinter import *
(2) 創(chuàng)建一個(gè)頂層容器對(duì)象
例如:創(chuàng)建一個(gè)窗體對(duì)象: win = tkinter.Tk()(
3) 在頂層容器對(duì)象中,添加其它組件
(4) 調(diào)用pack()方法進(jìn)行容器的區(qū)域布局
(5) 進(jìn)入主事件循環(huán):win.mainloop()
當(dāng)容器進(jìn)入主事件循環(huán)狀態(tài)時(shí),容器內(nèi)部的其他圖形對(duì)象則處于循環(huán)等待狀態(tài), 這樣才能一直保持顯示狀態(tài)。
3.2.1 窗體容器和標(biāo)簽組件
3.2.1.1 創(chuàng)建窗體
窗體是帶有標(biāo)題、邊框的一個(gè)頂層容器,在其內(nèi)部可以添加其它組件。
設(shè)計(jì)一個(gè)窗體的主要步驟如下:
(1) 導(dǎo)入tkinter 包:import tkinter
(2) 創(chuàng)建窗體對(duì)象:win = tkinter.Tk()
(3) 設(shè)置窗體初始的大?。▽挕粮撸┖臀恢茫▁, y):win.geometry(’寬×高+ x 坐標(biāo)+ y 坐標(biāo)’)
(4) 設(shè)置事件循環(huán),使窗體一直保持顯示狀態(tài):win. mainloop()
通過(guò)Tk 對(duì)象創(chuàng)建一個(gè)最簡(jiǎn)單窗體示例代碼如下:
圖1 創(chuàng)建窗體
3.2.1.2 使用標(biāo)簽
標(biāo)簽是用于窗體容器中顯示文字內(nèi)容的組件。標(biāo)簽的基本格式為:label = tkinter.Label (容器名稱,顯示文字或圖像內(nèi)容,顯示位置, 文字字體、顏色等)標(biāo)簽應(yīng)用示例代碼如下:
3.2.1.3 按鈕對(duì)象
創(chuàng)建按鈕對(duì)象的方法為:Btn = tkinter.Button(容器,text ="按鈕上的文字")由于按鈕是一個(gè)普通組件,設(shè)計(jì)時(shí)必須放置到一個(gè)容器中,以下是設(shè)計(jì)一個(gè)按鈕事件程序代碼:
Python 定義了3 種界面布局管理方式。
3.3.1 pack 布局
pack 布局管理方式按組件的創(chuàng)建順序在容器區(qū)域中排列。
pack 的常用屬性有side 和fill。
side 屬性:其取值為’top’、’bottom’、’left’、’right’,分別表示組件排列在上、下、左、右的位置。默認(rèn)為top。
fill 屬性:其取值為’x’、’y’、’both’,分別表示填充x(水平)或y(垂直)方向的空間。
3.3.2 place 布局
place 布局管理方式為指定組件的坐標(biāo)位置排列,這種排列方式又稱為絕對(duì)布局。
3.3.3 grid 布局
grid 布局管理方式為網(wǎng)格布局,組件放置在二維表格的單元格中。
grid 布局的常用屬性有:row(行)、column(列)、rowspan(組件占據(jù)行數(shù))、columnspan(組件占據(jù)列數(shù))。
文本框的格式
Python 中,文本框Entry 用于接收輸入的數(shù)據(jù)。文本框Entry 的基本格式為:txt = tkinter.Entry (容器名稱,width=寬度, 文字字體、顏色等)文本框中的內(nèi)容設(shè)置及獲取文本框Entry 中文字內(nèi)容的操作可以使用StringVar()對(duì)象來(lái)完成。StringVar()是Tkinter 模塊的對(duì)象,它可以跟蹤變量值的變化,把最新的值顯示到界面上。把Entry的textvariable 屬性設(shè)置為StringVar(),再通過(guò)StringVar()的get()和set()函數(shù)讀取和輸出相應(yīng)內(nèi)容。這樣,文本框中始終顯示的值。運(yùn)用文本框?qū)傩栽O(shè)計(jì)一個(gè)密碼驗(yàn)證程序,編寫(xiě)程序代碼如下:
登陸界面運(yùn)行結(jié)果見(jiàn)圖2。
圖2 登陸界面運(yùn)行結(jié)果
3.5.1 單選按鈕(Radiobutton)和復(fù)選框(Checkbutton)
單選按鈕Radiobutton、復(fù)選框Checkbutton 是一組表示多種“選擇”的組件。它們都只有兩種狀態(tài):“選中/未選中”(ON/OFF),其屬性和方法都類似,按鈕的常用屬性見(jiàn)表1。
表1 按鈕的常用屬性
在創(chuàng)建單選按鈕Radiobutton 或復(fù)選框Checkbutton 時(shí),要先聲明一個(gè)選擇狀態(tài)變量:chVarDis = tk.Int-Var()
該變量記錄單選按鈕或復(fù)選框是否被勾選的狀態(tài),可以通過(guò)chVarDis.get()來(lái)獲取其的狀態(tài),其狀態(tài)值為int類型 勾選為1 未勾選為0。另外,復(fù)選框Checkbutton對(duì)象的select()方法表示勾選,deselect()方法表示不勾選。
3.5.2 標(biāo)簽框架、下拉列表框和滾動(dòng)文本框
3.5.2.1 標(biāo)簽框架LabelFrame
標(biāo)簽框架LabelFrame 是一個(gè)帶邊框的容器,可以在該容器中放置其它組件。
標(biāo)簽框架LabelFrame 的構(gòu)造方法為:
ttk.LabelFrame(上一級(jí)容器, text="標(biāo)簽顯示的文字內(nèi)容")
3.5.2.2 下拉列表Combobox
下拉列表Combobox 是常用的一種選值組件,使用下拉列表時(shí)要先聲明一個(gè)取值變量:number = tk.StringVar()
該變量記錄在下拉列表中預(yù)設(shè)的值中所選取的字符值,在下拉列表中所預(yù)設(shè)的值為一個(gè)元組。
下拉列表Combobox 的構(gòu)造方法為:ttk.Combobox(容器, width=寬度, textvariable=取值變量)
3.5.2.3 滾動(dòng)文本框scrolledtext
滾動(dòng)文本框scrolledtext 是一個(gè)帶滾動(dòng)條的文本框,可以輸入多行文本內(nèi)容。其構(gòu)造方法為:
scr = scrolledtext.ScrolledText(容器, width=文本框?qū)挾? height=文本框高度)
3.6.1 菜單
創(chuàng)建菜單的主要步驟如下:
(1) 創(chuàng)建菜單條對(duì)象:menubar = Menu(窗體容器)
(2) 把菜單條放置到窗體中:窗體容器. config(menu = menubar)
(3) 在菜單條中創(chuàng)建菜單:菜單名稱= Menu(menubar, tearoff = 0)
其中,tearoff 取值0 表示菜單不能獨(dú)立使用。
(4) 為菜單添加文字標(biāo)簽
menubar.add_cascade(label = "文字標(biāo)簽", menu =菜單名稱)
(5) 在菜單中添加菜單項(xiàng)
菜單名稱.add_command (label = " 菜單項(xiàng)名稱",command = 功能函數(shù)名)
3.6.2 對(duì)話框
Tkinter 提供了三種標(biāo)準(zhǔn)的對(duì)話框模塊:
(1) 消息對(duì)話框messagebox
(2) 文件對(duì)話框filedialog
(3) 顏色選擇對(duì)話框colorchooser
3.6.2.1 無(wú)返回值的消息對(duì)話框
消息對(duì)話框分為無(wú)返回值的對(duì)話框和有返回值的對(duì)話框,這二種消息對(duì)話框的導(dǎo)入模塊語(yǔ)句都是一樣的。
(1) 消息對(duì)話框的導(dǎo)入模塊語(yǔ)句
(2) 消息提示框:tkinter.messagebox.showinfo (’提示’,’快樂(lè)每一天’)
3.6.2.2 有返回值的消息對(duì)話框
(1) askokcancel()
askokcancel()函數(shù)在對(duì)話框中顯示“確定”和“取消”按鈕,其返回值分別為“Ture”或“False”。
(2) askquestion()
askquestion()函數(shù)在對(duì)話框中顯示“是”和“否”按鈕,其返回值分別為“yes”或“no”。
3.6.2.3 文件對(duì)話框filedialog
(1) 導(dǎo)入文件對(duì)話框模塊語(yǔ)句:import tkinter.filedialog
(2) 獲取文件對(duì)話框返回值
文件對(duì)話框的返回值為文件路徑和文件名。
文件對(duì)話框filedialog 應(yīng)用代碼如下:
3.6.2.4 顏色選擇對(duì)話框colorchooser
colorchooser.askcolor()提供一個(gè)用戶選擇顏色的界面。其返回值是一個(gè)二元組,第1 個(gè)元素是選擇的RGB顏色值,第2 個(gè)元素是對(duì)應(yīng)的十六進(jìn)制顏色值。
3.7.1 鼠標(biāo)事件
在Pyton 中,tkinter 模塊的事件event 都用字符串描述,格式為:組件對(duì)象.bind(event, handler)其中,event為事件,handler 為處理事件的函數(shù)。鼠標(biāo)按鈕的點(diǎn)擊事件的一般格式為:<ButtonPress-n> 其中,n 為鼠標(biāo)按鈕,n 為1 代表左鍵,2 代表中鍵,3 代表右鍵。例如,<ButtonPress-1>, 表示按下鼠標(biāo)的左鍵。(見(jiàn)表2)
表2 鼠標(biāo)事件
可以通過(guò)鼠標(biāo)事件event 來(lái)獲得鼠標(biāo)位置。坐標(biāo)點(diǎn)(event.x,event.y)為發(fā)生事件時(shí),鼠標(biāo)所在的位置。
編寫(xiě)捕獲鼠標(biāo)點(diǎn)擊事件的程序。當(dāng)鼠標(biāo)在窗體容器中點(diǎn)擊時(shí),記錄下其坐標(biāo)位置。
鼠標(biāo)事件運(yùn)行結(jié)果見(jiàn)圖3。
圖3 鼠標(biāo)事件運(yùn)行結(jié)果
3.7.2 鍵盤(pán)事件
表3 為方向鍵鍵值表。在捕獲鍵盤(pán)事件時(shí),先要用focus_set()方法把鍵盤(pán)的焦點(diǎn)設(shè)置到一個(gè)組件上,這樣才能捕獲到鍵盤(pán)事件,捕獲鍵盤(pán)事件,在窗體中顯示按下的鍵:鍵盤(pán)事件運(yùn)行結(jié)果見(jiàn)圖4。
表3 方向鍵鍵值表
圖4 鍵盤(pán)事件運(yùn)行結(jié)果
為了促進(jìn)學(xué)生更好、更直觀地學(xué)習(xí)圖形用戶界面設(shè)計(jì)以及Python 的基本知識(shí),設(shè)計(jì)實(shí)現(xiàn)一個(gè)所見(jiàn)即所得的用戶界面,學(xué)生可以通過(guò)本研究學(xué)習(xí),學(xué)會(huì)如何在用戶和程序之間可以方便地進(jìn)行交互,如何介紹設(shè)計(jì)友好的圖形用戶界面應(yīng)用程序。盡管Python 在C/C++、Java、C#等語(yǔ)言當(dāng)中是一種非常年輕的語(yǔ)言,但其強(qiáng)大的優(yōu)勢(shì)不容小覷。近幾年來(lái),Python 在編程領(lǐng)域,一直在穩(wěn)步上升。相信Python 在未來(lái)會(huì)有更強(qiáng)的發(fā)展,并且很可能成為快速發(fā)展的主流語(yǔ)言[5]。