python學習筆記14--用Tkinter實現GUI編程

前面我們學習了turtle繪製圖形文字的一些用法,這一節主要學習Tkinter。Tkinter是python進行GUI編程的高效工具,類似於VC中的MFC,集成了許多控件,如按鈕、標籤、菜單、文本框等。前面我們在terminal中用sudo apt-get install python-tk安裝了Tkinter,所以在py文件中加上from Tkinter import * (也有的是from tkinter import *),即可使用其中的控件和函數。

1. Tkinter入門

首先,舉一個小例子:

#coding=utf-8
from Tkinter import *

def processOk():
    print ("OK button is clicked.")

def processCancel():
    print ("Cancel button is clicked")

# 創建一個窗口
window = Tk()

# 創建兩個按鈕
btOk = Button(window,text = "OK", fg = "red", command = processOk)
btCancel = Button(window,text = "cancel", bg = "yellow", command = processCancel)

# 將按鈕置在窗口上
btOk.pack()
btCancel.pack()

# 創建一個事件循環,監測事件發生,直到窗口關閉
window.mainloop()


這個例子的運行結果爲:


點擊OK按鈕,會在控制檯顯示OK button is clicked,點擊取消按鈕亦是。

1)例子中btOk = Button(window, text = "OK", fg = "red", command = processOk)是創建一個按鈕,其中第一個參數,通常是該控件的父容器,這裏指的是該button是在window中的;第二個參數是該按鈕的顯示內容;第三個參數是前景色(對應的bg爲背景色,見第二個按鈕創建);第四個參數command,是指當鼠標點擊這個按鈕時觸發的事件函數,這裏是processOK函數。

2)btOk.pack()是將按鈕在window中一行接着一行佈局。

3)window.mainloop()這句創建一個事件循環,它會不停的捕捉在window內的事件直到window關閉,如果觸發某個函數則執行,如本例中的點擊按鈕操作。


2. Tkinter的各種GUI控件

這一節介紹幾個常見的Tkinter控件,python中叫做widgets。

Button:簡單的按鈕,用來執行觸發操作,如上例;

Canvas:帆布,結構化的圖形界面,可以在上面繪製各種圖形,進行圖形編輯;

Checkbutton:複選框;

Entry:文本編輯區域,類似於MFC中的text field或text box;

Frame:框架,用來包含其他控件,主要用於控制界面佈局;

Label:文本或圖片顯示;

Menu:菜單;

Menubutton:菜單按鈕;

Message:顯示文本,和Label控件類似,但是Message可以根據文本的長度自動調整顯示;

Radiobutton:單選按鈕;

Text:格式化文本顯示,允許編輯文本的顯示風格和屬性。

下面舉個例子(其中用到了Checkbutton、Radiobutton、Frame、Entry、Label、Message、Text、Button控件):

#coding=utf-8
from Tkinter import *

class WidgetsDemo:
    def __init__(self):
        window = Tk()                 # 創建一個窗口
        window.title("Widgets Demo")  # 設置標題
        
        frame1 = Frame(window)        # 創建一個框架
        frame1.pack()                 # 將框架frame1放置在window中
        
        self.v1 = IntVar()
        # 創建一個複選框,如果選中則self.v1爲1,否則爲0,當點擊cbtBold時,觸發processCheckbutton函數
        cbtBold = Checkbutton(frame1,text="Bold",variable=self.v1,
                              command=self.processCheckbutton)
        
        self.v2 = IntVar()
        # 創建兩個單選按鈕,放置在frame1中,按鈕文本是分別是Red和Yellow,背景色分別是紅色和黃色,
        # 當rbRed按鈕被選中時self.v2爲1,當rbYellow按鈕被選中時,self.v2爲2,按鈕被點擊時觸發processRadiobutto函數
        rbRed = Radiobutton(frame1,text="Red",bg="red",
                            variable=self.v2,value=1,
                            command=self.processRadiobutton)
        rbYellow = Radiobutton(frame1,text="Yellow",bg="yellow",
                               variable=self.v2,value=2,
                               command=self.processRadiobutton)
        # grid佈局
        cbtBold.grid(row=1,column=1)
        rbRed.grid(row=1,column=2)
        rbYellow.grid(row=1,column=3)
        
        frame2 = Frame(window)   # 創建框架frame2
        frame2.pack()            # 將frame2放置在window中
        
        
        label = Label(frame2,text="Enter your name: ")   # 創建標籤
        self.name = StringVar()
        # 創建Entry,內容是與self.name關聯
        entryName = Entry(frame2,textvariable=self.name)
        # 創建按鈕,點擊按鈕時觸發processButton函數
        btGetName = Button(frame2,text="Get Name",
                           command=self.processButton)
        
        # 創建消息
        message = Message(frame2,text="It is a widgets demo")
        
        # grid佈局
        label.grid(row=1,column=1)
        entryName.grid(row=1,column=2)
        btGetName.grid(row=1,column=3)
        message.grid(row=1,column=4)
        
        # 創建格式化文本,並放置在window中
        text = Text(window)
        text.pack()
        text.insert(END,"Tip\nThe best way to learn Tkinter is to read")
        text.insert(END,"these carefully designed examples and use them")
        text.insert(END,"to create your applications.")
        
        # 監測事件直到window被關閉
        window.mainloop()
    
    # 複選框點擊按鈕函數
    def processCheckbutton(self):
        print ("Check button is:" 
               + ("checked" if self.v1.get() == 1 else "unchecked"))
    
    # 單選按鈕點擊函數
    def processRadiobutton(self):
        print (("Red" if self.v2.get() == 1 else "Yellow")
               + " is selected.")
    
    # Get Name按鈕點擊函數
    def processButton(self):
        print ("Your name is " + self.name.get())
    
WidgetsDemo()
該例子的運行結果爲:

1)self.v1 = IntVar()表示v1是Int型變量;

2)cbtBold = Checkbutton()這一句中variable = self.v1表示與v1關聯,默認情況爲當該按鈕選中時,v1=1,否則v1=0;rbRed = Radiobutton()這一句中也有類似的,其中value=1表示該按鈕選中是v2=1,若選中rbYellow,則v2=2;

3)cbtBold.grid(row=1,column=1)與之前的pack()函數一樣,都是佈局函數,不過這裏是在Frame中劃分行列,並在特定行列顯示;

4)text.insert(END," ")是指向Text中插入格式化文本,其中END是指將文本插入到當前文本的後面;

5)另外,可以像下面這樣修改控件的參數:rdRed["text"] = "This Is Red" ;rdRed["cursor"] = "plus"(光標到這裏變成十字);

6)self.name.get()函數可以獲得變量內容。


3. Canvas

Canvas類似於一個畫板,可以在上面繪製各種圖形和進行圖形編輯,Canvas的座標系不同於turtle的座標系,它是以canvas的左上角點爲原點(0,0),以右方和下方爲x軸正軸和y軸正軸,並以像素爲單位;下面介紹幾個常用的繪製函數:

create_rectange(x1,y1,x2,y2):繪製一個矩形,(x1,y1)爲矩形左上角點,(x2,y2)爲矩形右下角點;

create_oval(x1,y1,x2,y2):繪製一個橢圓,(x1,y1)和(x2,y2)分別爲橢圓外接矩形的左上角點和右下角點;

create_arc(x1,y1,x2,y2,start,extent):繪製一個弧形, (x1,y1)和(x2,y2)分別爲橢圓或圓外接矩形的左上角點和右下角點,start是弧形角度開始點,extent是弧形角度;

create_polygon(x1,y1,x2,y2,x3,y3):繪製一個多邊形,(xi,yi)分別爲各頂點座標;

create_line(x1,y1,x2,y2):繪製線條,(x1,y1)和(x2,y2)分別爲起始點和結束點;

create_text(x,y,text):繪製字符串在以(x,y)爲中心的位置。

下面舉個小例子說明用法:

window = Tk()
canvas = Canvas(window,width=200,height=100,bg="white")
canvas.pack()
canvas.create_rectangle(10,10,190,90,tags="rect")
#canvas.create_oval(10,10,190,90,fill="red",tags="oval")
#canvas.create_arc(10,10,190,90,start=0,extent=90,width=8,fill="red",tags="arc")
#canvas.create_polygon(10,10,190,90,30,50,tags="poly")
#canvas.create_line(10,90,190,10,width=9,arrow="last",activefill="blue",tags="line")
#canvas.create_text(60,40,text="string",font="Times 10 bold underline",tags="string")
#canvas.delete("rect","oval","arc","poly","line","string")
window.mainloop()
對其中出現的一些字段做簡要說明:create_rectangle()中的tags表示的是這個圖形在canvas中的標識,在後面的canvas.delete()(刪除canvas中的圖形)中也使用到;create_oval()中的fill表示的是填充顏色;create_arc()中的width表示的是圖形線段的寬度;create_line中的arrow="last"表示在線段末尾加箭頭,active fill表示若鼠標移動到這條線段上時,線段的顏色會變成藍色;create_text()中的font是字體。


4. Geometry Managers

Tkinter利用Geometry Managers在容器中佈置控件,有三種Geometry managers:grid,pack,place。其中前兩種在之前使用過。每一種管理方式都不同,所以通常不在一個容器中混合使用這三種方式,而是利用Frame子容器來分開使用geometry managers。

1)grid

grid的通常表示方式是:widgets.grid(row=a, column=b, rowspan=c, columnspan=d, padx=e, pady=f, sticky=E)。其中前兩個參數已經用過,rowspan和columnspan表示控件跨幾行幾列;padx和pady表示與容器的水平邊線和垂直邊線間隔多少像素值;sticky表示在容器內容的什麼方位,有E,S,N,W,SE,SW,NW,NE幾種。具體可測試。

2)pack

上面的例子,默認pack的方式是一行一行進行的。pack中可以用side來設置放置的方式,有LEFT, RIGHT, TOP, BOTTOM,默認的方式就是TOP,如widget.pack(side=LEFT)。

3)place

place可以在任何位置放置控件,用法爲widgets.place(x=a,y=b),a,b分別爲座標。值得注意的是,place manager並不兼容所有的計算機,如果windows的分辨率爲1024*768,那麼place正好可用,若分辨率過高或過低,都會出現顯示問題。


5. 使用圖片

可以用photo = PhotoImage(file = imagefilename)來加載圖片。然後在控件的創建中使用圖片。如

testImage = PhotoImage(file = "testimage.gif")

Label(window,image=testImage)
canvas.create_image(90,50,image=testImage)
Button(window,image=testImage)

這一節暫時學習這麼多,後面的Menu, Mouse, Key Events, Scrollbars, Animation, Dialog等後續再學習。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章