Python學習(28)--tkinter圖形界面程式設計1
這一節我們将介紹Python内置的圖形界面程式設計子產品tkinter,tkinter是Python标準的GUI程式設計接口,可以良好的運作在大多數的系統平台中,隻需要安裝好Python就可以導入tkinter子產品并使用,無需安裝第三方庫。
tkinter的主要學習内容分為四個部分:tkinter元件,資料顯示,布局以及滑鼠事件。本節介紹的内容為tkinter控件,具體的内容為:主窗體,Lable控件,Button控件,Entry控件,Text控件。
1.主窗體
tkinter的所有控件都需要盛放在一個容器中,這個容器就是主窗體,在建立控件之前都必須要建立主窗體。主窗體的建立過程如下代碼:
<b>[python]</b> view plain copy
import tkinter
win=tkinter.Tk()#建立一個窗體
win.title("MyWindow")#為窗體添加一個标題
win.geometry("400x300+120+50")#設定窗體的位置和大小
win.mainloop()#顯示生成的主窗體
如上代碼,使用子產品tkinter的方法Tk()建立一個窗體;title()方法設定窗體的标題;geometry()設定窗體的長寬和位置,字元串"400x300+120+50"為将窗體設定為長400px,寬300px,左上角頂點坐标位置為(120,50);方法mainloop()為将建立的窗體顯示出來。
結果如下:

如上結果,窗體建立的的坐标系為:螢幕左上角頂點為坐标原點(0,0),原點向右為X軸,向下為Y軸,建立窗體時需要指定其左上角頂點的坐标和窗體的長寬,方式為調用窗體對象的geometry()方法,參數為一個字元串"widthxheight+X+Y",width指定窗體寬度,height指定窗體長度,X為窗體左上角頂點x軸坐标值,Y為窗體左上角頂點y軸坐标值。
2.Lable控件
Lable控件的主要功能為顯示文本内容,也是GUI程式設計中常用的基本控件,Label主要學習内容為控件的各種屬性,下面我們通過例子來一一講解這些屬性。代碼如下:
# Lable控件
label=tkinter.Label(win,#設定子控件Lable的父容器為主窗體win
text="My name is LiMing",#Lable顯示的文本内容
bg="red",#Lable的背景顔色
font=("黑體",20),#Lable顯示文本的顔色和字型
width=10,#Lable控件的寬度
height=10,#Lable控件的長度
wraplength=50,#每wraplength寬度的文本換行一次
justify="left",#文本顯示的方向,right為從右至左顯示文本,left為從左至右顯示文本
anchor="center")#文本顯示内容在Lable中的位置,
# 一共有n,s,e,w,ne,nw,se,sw,center九個方向,
# 分别對應北,南,東,西,東北,西北,東南,西南,中心
label.pack()#将子控件lable挂載到主窗體
如上,使用tkinter子產品的Label()方法建立一個Label控件,首先需要指定父容器,所謂父容器通俗的含義就是子控件放在哪個父控件中顯示,這裡指定Label的父容器為主窗體win;接着,可以使用Label控件的各種屬性設定文本内容顯示的樣式。如text屬性設定文本顯示的内容,bg設定Label的背景顔色等等。如上的注釋,可以清楚的看到Label各種屬性及其作用和含義。學習tkinter的各種控件,了解其屬性的使用是一個重要内容。
代碼結果如下:
3.Button控件
Button控件為常見的按鈕,功能主要為點選按鈕後響應相應的操作。如下代碼:
def func():#點選按鈕後響應的函數
print("您點選了按鈕")
# Button控件
button=tkinter.Button(win,#設定子控件Button的父容器為主窗體win
text="button",#設定Button按鈕顯示的文本内容
command=func,#設定點選按鈕後響應的事件,這裡點選按鈕後會執行函數func
width=10,#設定按鈕的寬度
height=4)#設定按鈕的長度
button.pack()#将Button控件挂載到主窗體上
如上代碼,Button中涉及的屬性有text,command,width,height等等。其實,這些都是很多控件通用的屬性,如text為設定在控件上顯示的文本内容,command為設定點選控件後需要響應的函數操作,這裡command=func,表示點選按鈕後會執行函數func()。代碼運作結果如下:
點選按鈕執行函數func()後的列印結果如下:
4.Entry控件
Entry是一個文本輸入框控件,用于文本的輸入,主要功能為接收使用者向應用程式傳達的消息。以下是一個Entry控件的案例及代碼注釋:
#Entry控件
e=tkinter.Variable()#建立一個變量e
entry=tkinter.Entry(win,#設定Entry控件的父容器為win
# show="*",#設定輸入框為密碼框
textvariable=e)#将變量e與控件entry綁定
e.set("我是輸入框")#設定輸入框對象的文本内容
print("e.get:",e.get())#通過與Entry控件綁定的變量e擷取輸入内容
print("entry.get:",entry.get())#通過Entry對象直接擷取文本框内容
entry.pack()#将Entry控件挂載到父控件窗體上
如上代碼,使用tkinter子產品的Entry()方法建立一個文本輸入框,那麼應用程式如何獲知使用者在文本框中的輸入内容呢?這裡有兩種方法:
第一種方法,直接調用Entry對象的get()方法擷取文本内容,如上entry.get()。但這種方法的局限性在于,隻能擷取文本框的内容,并不能實時的修改文本内容。
第二種方法為,将Entry對象與一個變量var綁定,所有對文本内容的讀寫都是在基于var進行的,var就相當于使用者與文本框進行資訊交流的視窗。
如上,首先我們通過tkinter子產品的Variable()方法建立一個變量e;
然後,将entry對象的textvariable的屬性值設定為e,此時文本框對象entry與e綁定起來;
最後,通過變量e對文本框進行讀寫操作,如e.get()為擷取entry對象的文本内容,e.set()為設定entry對象的文本内容。此時,文本框entry的内容由與之綁定的變量e操控,顯然第二種方法将控件與文本輸入資料分離開,操作的靈活性更強。
程式運作結果如下:
對輸入框文本内容讀取的列印結果如下:
文本輸入框Entry還有一個重要屬性show,當使用者輸入的内容為密碼時,就用到了它。show="*"時,使用者輸入的内容不再可見,而是成為密碼形式的"******"字元串。如下為當屬性show="*"時的程式運作結果:
5.Text控件
之前介紹過的Entry控件隻适用于使用者輸入少量的,重要的文本。當我們需要輸入并編輯大量的文本時,如發送一封郵件,就需要使用Text多文本輸入控件。可以将Text控件類比于Windows作業系統的txt文檔編輯器。如下例子,Text控件可看作為把txt編輯器内嵌入程式主窗體中。
win.geometry("200x100+120+50")#設定窗體的位置和大小
# Text控件
text=tkinter.Text(win,#設定Text控件的父容器為win
width=20,
height=5)
str='''''There are moments in life when you miss
someone so much that you just want to pick them
from your dreams and hug them for real! Dream
what you want to dream;go where you want to go;
be what you want to be,because you have only one
life and one chance to do all the things you want to do.
'''
text.insert(tkinter.INSERT,str)#為text文本框添加文本内容str
text.pack()#将text文本框挂載到父容器
如上,通過tkinter子產品的Text()方法建立了一個多文本輸入對象text,并設定其寬和高。Text對象的一個很常用的方法就是insert(),用于向多文本輸入框中插入文本,如上對象text調用insert()方法插入文本内容,參數tkinter.INSERT表示向文本插入文本str。代碼執行的結果如下:
通過觀察可以發現,文本内容并不能完全顯示,這是因為整個文本的長和寬大于Text控件的長和寬,導緻隻能部分顯示文本。類比于txt編輯器,當文本内容溢出時,我們可以使用滑動條,通過滑動來顯示溢出部分的文本。添加滑動條後的代碼如下:
scroll=tkinter.Scrollbar()#建立一個滑動條
text.pack(side=tkinter.LEFT,fill=tkinter.Y)#設定文本框在父容器的左側,
# 文本框在父容器的Y方向充滿
scroll.pack(side=tkinter.RIGHT,fill=tkinter.Y)#設定滑動條在父容器的右側,
# 滑動條在父容器的Y方向上充滿
如上,我們通過tkinter子產品的Scrollbar()方法建立了一個滑動條,side=tkinter.LEFT表明将滑動條scroll顯示在父容器(主窗體win)的右側,fill=tkinter.Y表明滑動條scroll在Y方向上充滿父容器。同理,調用pack()方法使得多文本框text顯示在父容器的左側,并在Y方向上充滿父容器win。程式執行結果如下:
添加滑動條後,隻是将滑動條顯示出來。拉動後溢出的文本并沒有随滑動條的移動而顯示出來,這是因為文本框與滑動條隻是獨立的存在,并沒有互相關聯起來。二者之間應該存在兩種關聯:
第一,移動滑動條,文本随滑動條移動的方向移動;
第二,移動文本,滑動條随文本移動的方向移動。
若要産生這兩種關聯,就需要兩者之間互相配置。代碼如下:
# 文本内容str在Text控件Y方向充滿
scroll.config(command=text.yview)#配置滑動條scroll随文本text移動的方向移動
text.config(yscrollcommand=scroll.set)#配置文本text随滑動條scroll移動的方向移動
如上代碼,我們在之前代碼的基礎上對滑動條scroll和文本text之間的關聯做出了相應的配置。如:scroll.config(command=text.yview),即為當文本text在y方向上發生移動事件時,滑動條會做出随之移動的響應;text.config(yscrollcommand=scroll.set),即為text會在Y方向上随滑動條移動。程式的運作結果如下:
經過對滑動條scroll和文本text的互相配置,實作了兩者間一方移動,另一方随之移動的效果。當然還可以在X方向上設定滑動條,這樣就可以顯示在X方向上的溢出文本。真正實作txt文檔編輯器的效果。
以上就是這一節tkinter控件的内容,我們介紹了文本顯示控件Label,按鈕控件Button,文本輸入控件Entry,多行文本輸入控件Text。通過對這四種控件介紹可以發現,其實控件的學習有關原理性的内容并不是很多,隻是需要我們熟練的掌握控件的屬性和使用方法即可。
下一節,我們将繼續介紹tkinter GUI程式設計,敬請期待。