1. 程式人生 > >Python標準庫中的Tkinter模組

Python標準庫中的Tkinter模組

Python自帶支援Tk的Tkinter,無需安裝任何包,就可以直接使用。Tkinter封裝了訪問Tk的介面,Tk是一個圖形庫,支援多個作業系統,使用Tcl語言開發。Tk會呼叫作業系統提供的本地GUI介面,完成最終的GUI。

        先看例子:

#file  tkintertest.py
#python  自帶的圖形介面學習
import  tkinter  as  tk
import  tkinter.messagebox  as  messagebox

class  Application(tk.Frame):
        def  __init__(self,  master=None):
                super().__init__(master)
                self.pack()
                self.createWidgets()

        def  createWidgets(self):
                self.nameInput  =tk.Entry(self,bg='yellow')
                self.nameInput.pack(padx=20,pady=30)
                self.helloLabel  =  tk.Label(self,  text='你好,世界!',bg='pink',fg='green')
                self.helloLabel.pack(side="top")
                self.alertButton  =  tk.Button(self,  text='你好',  command=self.hello)
                self.alertButton.pack()
                self.quitButton  =  tk.Button(self,  text='退出',  fg='red',command=root.destroy)
                self.quitButton.pack(side="bottom")
                li          =  ['C','python','php','html','SQL','java']
                movie    =  ['CSS','jQuery','Bootstrap']
                self.listb    =  tk.Listbox(self)                    #    建立兩個列表元件
                self.listb2  =  tk.Listbox(self)
                for  item  in  li:                                  #  第一個小部件插入資料
                        self.listb.insert(0,item)

                for  item  in  movie:                            #  第二個小部件插入資料
                        self.listb2.insert(0,item)

                self.listb.pack(side="left")                                        #  將小部件放置到主視窗中
                self.listb2.pack(side="right")

        def  hello(self):
                name  =  self.nameInput.get()  or  '世界'
                messagebox.showinfo('Message',  '你好,  %s  !'  %  name)

root=tk.Tk()
app  =  Application(master=root)
#  設定視窗標題:
app.master.title('你好,世界!')
app.master.maxsize(1000,400)

#  主訊息迴圈:
app.mainloop()


        一、控制元件
  
        Tkinter的提供各種控制元件,如按鈕,標籤和文字框,一個GUI應用程式中使用。這些控制元件通常被稱為控制元件或者部件。
目前有15種Tkinter的部件

        控制元件                  描述
Button              按鈕控制元件;在程式中顯示按鈕。
Canvas              畫布控制元件;顯示圖形元素如線條或文字
Checkbutton    多選框控制元件;用於在程式中提供多項選擇框
Entry                輸入控制元件;用於顯示簡單的文字內容
Frame                框架控制元件;在螢幕上顯示一個矩形區域,多用來作為容器
Label                標籤控制元件;可以顯示文字和點陣圖
Listbox            列表框控制元件;在Listbox視窗小部件是用來顯示一個字串列表給使用者
Menubutton      選單按鈕控制元件,由於顯示選單項。
Menu                  選單控制元件;顯示選單欄,下拉選單和彈出選單
Message            訊息控制元件;用來顯示多行文字,與label比較類似
Radiobutton    單選按鈕控制元件;顯示一個單選的按鈕狀態
Scale                範圍控制元件;顯示一個數值刻度,為輸出限定範圍的數字區間
Scrollbar        滾動條控制元件,當內容超過視覺化區域時使用,如列表框。.
Text                  文字控制元件;用於顯示多行文字
Toplevel          容器控制元件;用來提供一個單獨的對話方塊,和Frame比較類似
Spinbox            輸入控制元件;與Entry類似,但是可以指定輸入範圍值
PanedWindow    是一個窗口布局管理的外掛,可以包含一個或者多個子控制元件。
LabelFrame      是一個簡單的容器控制元件。常用與複雜的窗口布局。
tkMessageBox  用於顯示你應用程式的訊息框。

        二、佈局
      
        1、pack()

        pack()有以下幾個常用屬性:side、padx、pady、ipadx、ipady、fill、expand

        1.1、side
        side屬性有四個可選值:'top'、'bottom'、'left'、'right',分別表示將控制元件位置設在視窗頂部中心、底部中心、左邊中心、右邊中心。side預設值為'top'。

        1.2、padx、pady、ipadx、ipady
        這四個屬性分別設定控制元件水平方向外邊距、豎直方向外邊距、水平方向內邊距、豎直方向內邊距。

        1.3、fill
        fill屬性有四個可選值:'none'、'x'、'y'、'both'。分別表示不填充、將控制元件沿水平方向填充、將控制元件沿豎直方向填充、將控制元件沿水平和豎直方法填充。
        當side屬性被設為'top'、'bottom'時,fill只能沿水平方向填充;當side屬性被設為'left'、'right'時,fill只能沿豎直方向填充。

        1.4、expand
        expand屬性有兩個可選值:0、1(或者'yes'、'no')。expand預設值為0。
        當expand屬性為0時,前面所說的side、fill一切正常;當expand屬性為1時,side屬性無效,此時控制元件會在視窗中心位置,且fill既可沿水平方向填充,也可沿豎直方向填充。

        2、grid()

        grid()有以下幾個常用屬性:row、column、padx、pady、ipadx、ipady、rowspan、columnspan、sticky

        2.1、row、column

        grid()將視窗看做一張表格,將控制元件放在其中的單元格中,而row、column則用來設定控制元件所在單元格的座標。
例如:
#file:tkintertest2.py
import  tkinter  as  tk
window  =  tk.Tk()
window.title('tkinter測試')
window.geometry('400x400')

btn1  =  tk.Button(window,text='按鈕一',width=5,bg='green')
btn1.grid(row=0,column=0,rowspan=1,columnspan=2,sticky='W'+'N'+'S'+'E')

btn2  =  tk.Button(window,text='按鈕二',width=5,height=5,bg='red')
btn2.grid(row=0,column=2)

btn3  =  tk.Button(window,text='按鈕三',width=3,height=3,bg='blue')
btn3.grid(row=1,column=1)

btn4  =  tk.Button(window,text='按鈕四',width=15,height=10,bg='yellow')
btn4.grid(row=1,column=2)

window.mainloop()

        單元格的寬度、高度是由同一列中最寬、同一行中最高的控制元件的寬高決定的。

        2.2、padx、pady、ipadx、ipady

        這四個屬性分別設定控制元件水平方向外邊距、豎直方向外邊距、水平方向內邊距、豎直方向內邊距。

        2.3、rowspan、columnspan

        有時候,一個控制元件可能會佔用不止一個單元格,這時就要用到rowspan、columnspan,他們的作用與合併單元格類似。
rowspan=3表示該控制元件會在豎直方向佔用3行單元格;column=3則報表時該控制元件會在水平方向佔用3列單元格。

        2.4、sticky

        sticky屬性用於設定控制元件的對齊方式,其可選值有'N'、'S'、'E'、'W'以及這四個值的各種組合。

        當stick屬性的值為這四個方向中的一個時,控制元件會向相應方向對齊;當stick屬性的值為其中兩個時,控制元件會向相應的一個角對齊;當stick屬性的值為其中三個、四個時,控制元件會先向前兩個設定的方向對齊,然後向後兩個方向進行填充。

        3、place()

        place()有以下幾個常用屬性:x、y、relx、rely、anchor

        3.1、x、y
        x、y屬性用來設定控制元件的絕對座標。

        3.2、relx、rely
        relx、rely屬性用來設定控制元件的相對座標,範圍為0-1。
        可以同時使用相對座標和絕對座標,此時先根據相對座標確定控制元件位置,然後根據絕對座標使控制元件進行偏移,最後確定控制元件的最終位置。

        3.3、anchor
        anchor屬性有9個可選值,分別表示9個方向,用來設定控制元件的錨點。
        NW,    N,    NE
        W,CENTER,E
        SW,    S,    SE
        例如,anchor='nw',x=100,y=100表示控制元件的左上角將在座標(100,100)處,而anchor='n',x=100,y=100表示控制元件的頂邊中點將在座標(100,100)處。

        4、Frame()

        Frame()本身是tkinter中的一類控制元件,用來幫助我們進行佈局。