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