Tkinter支援16個核心的視窗部件,這個16個核心視窗部件類簡要描述如下:

Button:一個簡單的按鈕,用來執行一個命令或別的操作。

Canvas:組織圖形。這個部件可以用來繪製圖表和圖,建立圖形編輯器,實現定製視窗部件。

Checkbutton:代表一個變數,它有兩個不同的值。點選這個按鈕將會在這兩個值間切換。

Entry:文字輸入域。

Frame:一個容器視窗部件。幀可以有邊框和背景,當建立一個應用程式或dialog(對話)版面時,幀被用來組織其它的視窗部件。

Label:顯示一個文字或圖象。

Listbox:顯示供選方案的一個列表。listbox能夠被配置來得到radiobutton或checklist的行為。

Menu:選單條。用來實現下拉和彈出式選單。

Menubutton:選單按鈕。用來實現下拉式選單。

Message:顯示一文字。類似label視窗部件,但是能夠自動地調整文字到給定的寬度或比率。

Radiobutton:代表一個變數,它可以有多個值中的一個。點選它將為這個變數設定值,並且清除與這同一變數相關的其它radiobutton。

Scale:允許你通過滑塊來設定一數字值。

Scrollbar:為配合使用canvas, entry, listbox, and text視窗部件的標準滾動條。

Text:格式化文字顯示。允許你用不同的樣式和屬性來顯示和編輯文字。同時支援內嵌圖象和視窗。

Toplevel:一個容器視窗部件,作為一個單獨的、最上面的視窗顯示。

messageBox:訊息框,用於顯示你應用程式的訊息框。(Python2中為tkMessagebox)

注意在Tkinter中視窗部件類沒有分級;所有的視窗部件類在樹中都是兄弟關係。

所有這些視窗部件提供了Misc和幾何管理方法、配置管理方法和部件自己定義的另外的方法。此外,Toplevel類也提供視窗管理介面。這意味一個典型的視窗部件類提供了大約150種方法。

四、動手實踐學習

1. 建立主視窗及Label部件(標籤)建立使用

  我們要學習使用上面提到的這些控制元件首先要建立一個主視窗,就像作畫一樣,先要架好架子和畫板,然後才能在上面放畫紙和各種繪畫元素,建立好主窗口才能在上面放置各種控制元件元素。而建立過程是很簡單的,如下:

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上設定標籤
l = tk.Label(window, text='你好!this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2)
# 說明: bg為背景,font為字型,width為長,height為高,這裡的長和高是字元的長和高,比如height=2,就是標籤有2個字元這麼高

# 第5步,放置標籤
l.pack()    # Label內容content區域放置位置,自動調節尺寸
# 放置lable的方法有:1)l.pack(); 2)l.place();

# 第6步,主視窗迴圈顯示
window.mainloop()
# 注意,loop因為是迴圈的意思,window.mainloop就會讓window不斷的重新整理,如果沒有mainloop,就是一個靜態的window,傳入進去的值就不會有迴圈,mainloop就相當於一個很大的while迴圈,有個while,每點選一次就會更新一次,所以我們必須要有迴圈
# 所有的視窗檔案都必須有類似的mainloop函式,mainloop是視窗檔案的關鍵的關鍵。
.

  測試效果:

2. Button視窗部件

  簡單說明:

  Button(按鈕)部件是一個標準的Tkinter視窗部件,用來實現各種按鈕。按鈕能夠包含文字或圖象,並且你能夠將按鈕與一個Python函式或方法相關聯。當這個按鈕被按下時,Tkinter自動呼叫相關聯的函式或方法。

按鈕僅能顯示一種字型,但是這個文字可以跨行。另外,這個文字中的一個字母可以有下劃線,例如標明一個快捷鍵。預設情況,Tab鍵用於將焦點移動到一個按鈕部件。

  什麼時候用按鈕部件

  簡言之,按鈕部件用來讓使用者說“馬上給我執行這個任務”,通常我們用顯示在按鈕上的文字或圖象來提示。按鈕通常用在工具條中或應用程式視窗中,並且用來接收或忽略輸入在對話方塊中的資料。關於按鈕和輸入的資料的配合,可以參看Checkbutton和Radiobutton部件。

  如何建立:

普通的按鈕很容易被建立,僅僅指定按鈕的內容(文字、點陣圖、圖象)和一個當按鈕被按下時的回撥函式即可:

b = tk.Button(window, text="hit me", command=hit_me)

沒有回撥函式的按鈕是沒有用的,當你按下這個按鈕時它什麼也不做。你可能在開發一個應用程式的時候想實現這種按鈕,比如為了不干擾你的beta版的測試者:

b = tk.Button(window, text="Help", command=DISABLED)

   示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上設定標籤
var = tk.StringVar()    # 將label標籤的內容設定為字元型別,用var來接收hit_me函式的傳出內容用以顯示在標籤上
l = tk.Label(window, textvariable=var, bg='green', fg='white', font=('Arial', 12), width=30, height=2)
# 說明: bg為背景,fg為字型顏色,font為字型,width為長,height為高,這裡的長和高是字元的長和高,比如height=2,就是標籤有2個字元這麼高
l.pack()

# 定義一個函式功能(內容自己自由編寫),供點選Button按鍵時呼叫,呼叫命令引數command=函式名
on_hit = False
def hit_me():
    global on_hit
    if on_hit == False:
        on_hit = True
        var.set('you hit me')
    else:
        on_hit = False
        var.set('')

# 第5步,在視窗介面設定放置Button按鍵
b = tk.Button(window, text='hit me', font=('Arial', 12), width=10, height=1, command=hit_me)
b.pack()

# 第6步,主視窗迴圈顯示
window.mainloop()

  測試效果:

 

3. Entry視窗部件

  簡單說明:  

  Entry是tkinter類中提供的的一個單行文字輸入域,用來輸入顯示一行文字,收集鍵盤輸入(類似 HTML 中的 text)。

  什麼時候用:

  需要使用者輸入使用者資訊時,比如我們平時使用軟體、登入網頁時,使用者互動介面讓我們登入賬戶資訊等時候可以用到。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上設定輸入框控制元件entry並放置控制元件
e1 = tk.Entry(window, show='*', font=('Arial', 14))   # 顯示成密文形式
e2 = tk.Entry(window, show=None, font=('Arial', 14))  # 顯示成明文形式
e1.pack()
e2.pack()

# 第5步,主視窗迴圈顯示
window.mainloop()

  測試效果:

4. Text視窗部件

  簡單說明:  

  Text是tkinter類中提供的的一個多行文字區域,顯示多行文字,可用來收集(或顯示)使用者輸入的文字(類似 HTML 中的 textarea),格式化文字顯示,允許你用不同的樣式和屬性來顯示和編輯文字,同時支援內嵌圖象和視窗。

  什麼時候用:

  在需要顯示編輯使用者、產品多行資訊時,比如顯示使用者詳細描述文字,產品簡介等等,支援隨時編輯。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上設定輸入框控制元件entry框並放置
e = tk.Entry(window, show = None)#顯示成明文形式
e.pack()

# 第5步,定義兩個觸發事件時的函式insert_point和insert_end(注意:因為Python的執行順序是從上往下,所以函式一定要放在按鈕的上面)
def insert_point(): # 在滑鼠焦點處插入輸入內容
    var = e.get()
    t.insert('insert', var)
def insert_end():   # 在文字框內容最後接著插入輸入內容
    var = e.get()
    t.insert('end', var)

# 第6步,建立並放置兩個按鈕分別觸發兩種情況
b1 = tk.Button(window, text='insert point', width=10,
               height=2, command=insert_point)
b1.pack()
b2 = tk.Button(window, text='insert end', width=10,
               height=2, command=insert_end)
b2.pack()

# 第7步,建立並放置一個多行文字框text用以顯示,指定height=3為文字框是三個字元高度
t = tk.Text(window, height=3)
t.pack()

# 第8步,主視窗迴圈顯示
window.mainloop()

  測試效果:

5. Listbox視窗部件

  簡單說明:  

  Text是tkinter類中提供的的列表框部件,顯示供選方案的一個列表。listbox能夠被配置來得到radiobutton或checklist的行為。

  什麼時候用:

  在有一個很多內容選項組成的列表提供使用者選擇時會用到。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上建立一個標籤label用以顯示並放置
var1 = tk.StringVar()  # 建立變數,用var1用來接收滑鼠點選具體選項的內容
l = tk.Label(window, bg='green', fg='yellow',font=('Arial', 12), width=10, textvariable=var1)
l.pack()

# 第6步,建立一個方法用於按鈕的點選事件
def print_selection():
    value = lb.get(lb.curselection())   # 獲取當前選中的文字
    var1.set(value)  # 為label設定值

# 第5步,建立一個按鈕並放置,點選按鈕呼叫print_selection函式
b1 = tk.Button(window, text='print selection', width=15, height=2, command=print_selection)
b1.pack()

# 第7步,建立Listbox併為其新增內容
var2 = tk.StringVar()
var2.set((1,2,3,4)) # 為變數var2設定值
# 建立Listbox
lb = tk.Listbox(window, listvariable=var2)  #將var2的值賦給Listbox
# 建立一個list並將值迴圈新增到Listbox控制元件中
list_items = [11,22,33,44]
for item in list_items:
    lb.insert('end', item)  # 從最後一個位置開始加入值
lb.insert(1, 'first')       # 在第一個位置加入'first'字元
lb.insert(2, 'second')      # 在第二個位置加入'second'字元
lb.delete(2)                # 刪除第二個位置的字元
lb.pack()

# 第8步,主視窗迴圈顯示
window.mainloop()

  測試效果:

6. Radiobutton視窗部件

  簡單說明:  

  Radiobutton:代表一個變數,它可以有多個值中的一個。點選它將為這個變數設定值,並且清除與這同一變數相關的其它radiobutton。

  什麼時候用:

  在有一個很多內容選項組成的選項列表提供使用者選擇時會用到,使用者一次只能選擇其中一個,不能多選。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上建立一個標籤label用以顯示並放置
var = tk.StringVar()    # 定義一個var用來將radiobutton的值和Label的值聯絡在一起.
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()

# 第6步,定義選項觸發函式功能
def print_selection():
    l.config(text='you have selected ' + var.get())

# 第5步,建立三個radiobutton選項,其中variable=var, value='A'的意思就是,當我們滑鼠選中了其中一個選項,把value的值A放到變數var中,然後賦值給variable
r1 = tk.Radiobutton(window, text='Option A', variable=var, value='A', command=print_selection)
r1.pack()
r2 = tk.Radiobutton(window, text='Option B', variable=var, value='B', command=print_selection)
r2.pack()
r3 = tk.Radiobutton(window, text='Option C', variable=var, value='C', command=print_selection)
r3.pack()

# 第7步,主視窗迴圈顯示
window.mainloop()

  測試效果:

7. Checkbutton視窗部件

  簡單說明:  

  Checkbutton:代表一個變數,它有兩個不同的值。點選這個按鈕將會在這兩個值間切換,選擇和取消選擇。

  什麼時候用:

  在有一個很多內容選項組成的選項列表提供使用者選擇時會用到,使用者一次可以選擇多個。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上建立一個標籤label用以顯示並放置
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()

# 第6步,定義觸發函式功能
def print_selection():
    if (var1.get() == 1) & (var2.get() == 0):     # 如果選中第一個選項,未選中第二個選項
        l.config(text='I love only Python ')
    elif (var1.get() == 0) & (var2.get() == 1):   # 如果選中第二個選項,未選中第一個選項
        l.config(text='I love only C++')
    elif (var1.get() == 0) & (var2.get() == 0):   # 如果兩個選項都未選中
        l.config(text='I do not love either')
    else:
        l.config(text='I love both')             # 如果兩個選項都選中

# 第5步,定義兩個Checkbutton選項並放置
var1 = tk.IntVar()  # 定義var1和var2整型變數用來存放選擇行為返回值
var2 = tk.IntVar()
c1 = tk.Checkbutton(window, text='Python',variable=var1, onvalue=1, offvalue=0, command=print_selection)    # 傳值原理類似於radiobutton部件
c1.pack()
c2 = tk.Checkbutton(window, text='C++',variable=var2, onvalue=1, offvalue=0, command=print_selection)
c2.pack()

# 第7步,主視窗迴圈顯示
window.mainloop()

  測試效果:

  

8. Scale視窗部件

  簡單說明:  

  Scale: 尺度(拉動條),允許你通過滑塊來設定一數字值。

  什麼時候用:

  在需要使用者給出評價等級,或者給出一個評價分數,或者拉動滑動條提供一個具體的數值等等。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上建立一個標籤label用以顯示並放置
l = tk.Label(window, bg='green', fg='white', width=20, text='empty')
l.pack()

# 第6步,定義一個觸發函式功能
def print_selection(v):
    l.config(text='you have selected ' + v)
# 第5步,建立一個尺度滑條,長度200字元,從0開始10結束,以2為刻度,精度為0.01,觸發呼叫print_selection函式 s = tk.Scale(window, label='try me', from_=0, to=10, orient=tk.HORIZONTAL, length=200, showvalue=0,tickinterval=2, resolution=0.01, command=print_selection) s.pack() # 第7步,主視窗迴圈顯示 window.mainloop()

  測試效果:

9. Canvas視窗部件

  簡單說明:  

  Canvas:畫布,提供繪圖功能(直線、橢圓、多邊形、矩形) 可以包含圖形或點陣圖,用來繪製圖表和圖,建立圖形編輯器,實現定製視窗部件。

  什麼時候用:

  在比如像使用者互動介面等,需要提供設計的圖示、圖形、logo等資訊是可以用到畫布。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上建立 500 * 200 大小的畫布並放置各種元素
canvas = tk.Canvas(window, bg='green', height=200, width=500)
# 說明圖片位置,並匯入圖片到畫布上
image_file = tk.PhotoImage(file='pic.gif')  # 圖片位置(相對路徑,與.py檔案同一資料夾下,也可以用絕對路徑,需要給定圖片具體絕對路徑)
image = canvas.create_image(250, 0, anchor='n',image=image_file)        # 圖片錨定點(n圖片頂端的中間點位置)放在畫布(250,0)座標處
# 定義多邊形引數,然後在畫布上畫出指定圖形
x0, y0, x1, y1 = 100, 100, 150, 150
line = canvas.create_line(x0-50, y0-50, x1-50, y1-50)                   # 畫直線
oval = canvas.create_oval(x0+120, y0+50, x1+120, y1+50, fill='yellow')  # 畫圓 用黃色填充
arc = canvas.create_arc(x0, y0+50, x1, y1+50, start=0, extent=180)      # 畫扇形 從0度開啟收到180度結束
rect = canvas.create_rectangle(330, 30, 330+20, 30+20)                  # 畫矩形正方形
canvas.pack()

# 第6步,觸發函式,用來一定指定圖形
def moveit():
    canvas.move(rect, 2, 2) # 移動正方形rect(也可以改成其他圖形名字用以移動一起圖形、元素),按每次(x=2, y=2)步長進行移動

# 第5步,定義一個按鈕用來移動指定圖形的在畫布上的位置
b = tk.Button(window, text='move item',command=moveit).pack()

# 第7步,主視窗迴圈顯示
window.mainloop()

  所用圖片:

  當然你可以隨意用你的一張圖片匯入畫布試一試效果,圖片可以用畫圖工具改一下畫素大小,以免圖片太大,匯入畫布顯示不全,當然你也可以用我提供的素材,下面是連結:https://files.cnblogs.com/files/shwee/pic.gif

 

  圖片錨定點位置引數圖:

  測試效果:

10. Menu視窗部件

  簡單說明:  

  Menu:選單條,用來實現下拉和彈出式選單,點下選單後彈出的一個選項列表,使用者可以從中選擇

  什麼時候用:

  在比如像軟體或網頁互動介面等,需要提供選單選項功能提供使用者選擇選單選項功能時用到。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上建立一個標籤用以顯示內容並放置
l = tk.Label(window, text='      ', bg='green')
l.pack()

# 第10步,定義一個函式功能,用來代表選單選項的功能,這裡為了操作簡單,定義的功能比較簡單
counter = 0
def do_job():
    global counter
    l.config(text='do '+ str(counter))
    counter += 1

# 第5步,建立一個選單欄,這裡我們可以把他理解成一個容器,在視窗的上方
menubar = tk.Menu(window)

# 第6步,建立一個File選單項(預設不下拉,下拉內容包括New,Open,Save,Exit功能項)
filemenu = tk.Menu(menubar, tearoff=0)
# 將上面定義的空選單命名為File,放在選單欄中,就是裝入那個容器中
menubar.add_cascade(label='File', menu=filemenu)

# 在File中加入New、Open、Save等小選單,即我們平時看到的下拉選單,每一個小選單對應命令操作。
filemenu.add_command(label='New', command=do_job)
filemenu.add_command(label='Open', command=do_job)
filemenu.add_command(label='Save', command=do_job)
filemenu.add_separator()    # 新增一條分隔線
filemenu.add_command(label='Exit', command=window.quit) # 用tkinter裡面自帶的quit()函式

# 第7步,建立一個Edit選單項(預設不下拉,下拉內容包括Cut,Copy,Paste功能項)
editmenu = tk.Menu(menubar, tearoff=0)
# 將上面定義的空選單命名為 Edit,放在選單欄中,就是裝入那個容器中
menubar.add_cascade(label='Edit', menu=editmenu)

# 同樣的在 Edit 中加入Cut、Copy、Paste等小命令功能單元,如果點選這些單元, 就會觸發do_job的功能
editmenu.add_command(label='Cut', command=do_job)
editmenu.add_command(label='Copy', command=do_job)
editmenu.add_command(label='Paste', command=do_job)

# 第8步,建立第二級選單,即選單項裡面的選單
submenu = tk.Menu(filemenu) # 和上面定義選單一樣,不過此處實在File上建立一個空的選單
filemenu.add_cascade(label='Import', menu=submenu, underline=0) # 給放入的選單submenu命名為Import

# 第9步,建立第三級選單命令,即選單項裡面的選單項裡面的選單命令(有點拗口,笑~~~)
submenu.add_command(label='Submenu_1', command=do_job)   # 這裡和上面建立原理也一樣,在Import選單項中加入一個小選單命令Submenu_1

# 第11步,建立選單欄完成後,配置讓選單欄menubar顯示出來
window.config(menu=menubar)

# 第12步,主視窗迴圈顯示
window.mainloop()

  測試效果:

11. Frame 視窗部件

  簡單說明:  

  Frame:框架,用來承載放置其他GUI元素,就是一個容器,是一個在 Windows 上分離小區域的部件, 它能將 Windows 分成不同的區,然後存放不同的其他部件. 同時一個 Frame 上也能再分成兩個 Frame, Frame 可以認為是一種容器.

  什麼時候用:

  在比如像軟體或網頁互動介面等,有不同的介面邏輯層級和功能區域劃分時可以用到,讓互動介面邏輯更加清晰。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,在圖形介面上建立一個標籤用以顯示內容並放置
tk.Label(window, text='on the window', bg='red', font=('Arial', 16)).pack()   # 和前面部件分開建立和放置不同,其實可以建立和放置一步完成

# 第5步,建立一個主frame,長在主window視窗上
frame = tk.Frame(window)
frame.pack()

# 第6步,建立第二層框架frame,長在主框架frame上面
frame_l = tk.Frame(frame)# 第二層frame,左frame,長在主frame上
frame_r = tk.Frame(frame)# 第二層frame,右frame,長在主frame上
frame_l.pack(side='left')
frame_r.pack(side='right')

# 第7步,建立三組標籤,為第二層frame上面的內容,分為左區域和右區域,用不同顏色標識
tk.Label(frame_l, text='on the frame_l1', bg='green').pack()
tk.Label(frame_l, text='on the frame_l2', bg='green').pack()
tk.Label(frame_l, text='on the frame_l3', bg='green').pack()
tk.Label(frame_r, text='on the frame_r1', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r2', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r3', bg='yellow').pack()

# 第8步,主視窗迴圈顯示
window.mainloop()

  測試效果:

 

12. messageBox視窗部件

  簡單說明:  

  messageBox:訊息框,用於顯示你應用程式的訊息框。(Python2中為tkMessagebox),其實這裡的messageBox就是我們平時看到的彈窗。 我們首先需要定義一個觸發功能,來觸發這個彈窗,這裡我們就放上以前學過的button按鈕,通過觸發功能,呼叫messagebox吧,點選button按鈕就會彈出提示對話方塊。下面給出messagebox提示資訊的幾種形式:

tkinter.messagebox.showinfo(title='Hi', message='你好!')            # 提示資訊對話窗
tkinter.messagebox.showwarning(title='Hi', message='有警告!')       # 提出警告對話窗
tkinter.messagebox.showerror(title='Hi', message='出錯了!')         # 提出錯誤對話窗
print(tkinter.messagebox.askquestion(title='Hi', message='你好!'))  # 詢問選擇對話窗return 'yes', 'no'
print(tkinter.messagebox.askyesno(title='Hi', message='你好!'))     # return 'True', 'False'
print(tkinter.messagebox.askokcancel(title='Hi', message='你好!'))  # return 'True', 'False'

  什麼時候用:

  在比如像軟體或網頁互動介面等,有不同的介面邏輯層級和功能區域劃分時可以用到,讓互動介面邏輯更加清晰。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入
import tkinter.messagebox  # 要使用messagebox先要匯入模組

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第5步,定義觸發函式功能
def hit_me():
    tkinter.messagebox.showinfo(title='Hi', message='你好!')              # 提示資訊對話窗
    # tkinter.messagebox.showwarning(title='Hi', message='有警告!')       # 提出警告對話窗
    # tkinter.messagebox.showerror(title='Hi', message='出錯了!')         # 提出錯誤對話窗
    # print(tkinter.messagebox.askquestion(title='Hi', message='你好!'))  # 詢問選擇對話窗return 'yes', 'no'
    # print(tkinter.messagebox.askyesno(title='Hi', message='你好!'))     # return 'True', 'False'
    # print(tkinter.messagebox.askokcancel(title='Hi', message='你好!'))  # return 'True', 'False'

# 第4步,在圖形介面上建立一個標籤用以顯示內容並放置
tk.Button(window, text='hit me', bg='green', font=('Arial', 14), command=hit_me).pack()

# 第6步,主視窗迴圈顯示
window.mainloop()

  測試效果:

 

13. 視窗部件三种放置方式pack/grid/place

  參考來源:

The Grid Geometry Manager
The Pack Geometry Manager
The Place Geometry Manager

  1. Grid:The Grid Geometry Manager  

  grid 是方格, 所以所有的內容會被放在這些規律的方格中。例如:

for i in range(3):
    for j in range(3):
        tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10)

  以上的程式碼就是建立一個三行三列的表格,其實 grid 就是用表格的形式定位的。這裡的引數 row 為行,colum 為列,padx 就是單元格左右間距,pady 就是單元格上下間距,ipadx是單元格內部元素與單元格的左右間距,ipady是單元格內部元素與單元格的上下間距。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,grid 放置方法
for i in range(3):
    for j in range(3):
        tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10)

# 第5步,主視窗迴圈顯示
window.mainloop()

  測試效果:

 

  2. Pack:The Pack Geometry Manager

   我們常用的pack(), 他會按照上下左右的方式排列.例如:

tk.Label(window, text='P', fg='red').pack(side='top')    # 上
tk.Label(window, text='P', fg='red').pack(side='bottom') # 下
tk.Label(window, text='P', fg='red').pack(side='left')   # 左
tk.Label(window, text='P', fg='red').pack(side='right')  # 右

   示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,pack 放置方法
tk.Label(window, text='P', fg='red').pack(side='top')    # 上
tk.Label(window, text='P', fg='red').pack(side='bottom') # 下
tk.Label(window, text='P', fg='red').pack(side='left')   # 左
tk.Label(window, text='P', fg='red').pack(side='right')  # 右

# 第5步,主視窗迴圈顯示
window.mainloop()

  測試效果:

  3. Place:The Place Geometry Manager

   再接下來我們來看place(), 這個比較容易理解,就是給精確的座標來定位,如此處給的(50, 100),就是將這個部件放在座標為(x=50, y=100)的這個位置, 後面的引數 anchor='nw',就是前面所講的錨定點是西北角。例如:

tk.Label(window, text='Pl', font=('Arial', 20), ).place(x=50, y=100, anchor='nw')

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('My Window')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('500x300')  # 這裡的乘是小x

# 第4步,place 放置方法(精準的放置到指定座標點的位置上)
tk.Label(window, text='Pl', font=('Arial', 20), ).place(x=50, y=100, anchor='nw')

# 第5步,主視窗迴圈顯示
window.mainloop()

  測試效果:

14. 綜合練習,使用者登入視窗例子

  編寫一個使用者登入介面,使用者可以登入賬戶資訊,如果賬戶已經存在,可以直接登入,登入名或者登入密碼輸入錯誤會提示,如果賬戶不存在,提示使用者註冊,點選註冊進去註冊頁面,輸入註冊資訊,確定後便可以返回登入介面進行登入。

  示例程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:洪衛

import tkinter as tk  # 使用Tkinter前需要先匯入
import tkinter.messagebox
import pickle

# 第1步,例項化object,建立視窗window
window = tk.Tk()

# 第2步,給視窗的視覺化起名字
window.title('Wellcome to Hongwei Website')

# 第3步,設定視窗的大小(長 * 寬)
window.geometry('400x300')  # 這裡的乘是小x

# 第4步,載入 wellcome image
canvas = tk.Canvas(window, width=400, height=135, bg='green')
image_file = tk.PhotoImage(file='pic.gif')
image = canvas.create_image(200, 0, anchor='n', image=image_file)
canvas.pack(side='top')
tk.Label(window, text='Wellcome',font=('Arial', 16)).pack()

# 第5步,使用者資訊
tk.Label(window, text='User name:', font=('Arial', 14)).place(x=10, y=170)
tk.Label(window, text='Password:', font=('Arial', 14)).place(x=10, y=210)

# 第6步,使用者登入輸入框entry
# 使用者名稱
var_usr_name = tk.StringVar()
var_usr_name.set('[email protected]')
entry_usr_name = tk.Entry(window, textvariable=var_usr_name, font=('Arial', 14))
entry_usr_name.place(x=120,y=175)
# 使用者密碼
var_usr_pwd = tk.StringVar()
entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, font=('Arial', 14), show='*')
entry_usr_pwd.place(x=120,y=215)

# 第8步,定義使用者登入功能
def usr_login():
    # 這兩行程式碼就是獲取使用者輸入的usr_name和usr_pwd
    usr_name = var_usr_name.get()
    usr_pwd = var_usr_pwd.get()

    # 這裡設定異常捕獲,當我們第一次訪問使用者資訊檔案時是不存在的,所以這裡設定異常捕獲。
    # 中間的兩行就是我們的匹配,即程式將輸入的資訊和檔案中的資訊匹配。
    try:
        with open('usrs_info.pickle', 'rb') as usr_file:
            usrs_info = pickle.load(usr_file)
    except FileNotFoundError:
        # 這裡就是我們在沒有讀取到`usr_file`的時候,程式會建立一個`usr_file`這個檔案,並將管理員
        # 的使用者和密碼寫入,即使用者名稱為`admin`密碼為`admin`。
        with open('usrs_info.pickle', 'wb') as usr_file:
            usrs_info = {'admin': 'admin'}
            pickle.dump(usrs_info, usr_file)
            usr_file.close()    # 必須先關閉,否則pickle.load()會出現EOFError: Ran out of input

    # 如果使用者名稱和密碼與檔案中的匹配成功,則會登入成功,並跳出彈窗how are you? 加上你的使用者名稱。
    if usr_name in usrs_info:
        if usr_pwd == usrs_info[usr_name]:
            tkinter.messagebox.showinfo(title='Welcome', message='How are you? ' + usr_name)
        # 如果使用者名稱匹配成功,而密碼輸入錯誤,則會彈出'Error, your password is wrong, try again.'
        else:
            tkinter.messagebox.showerror(message='Error, your password is wrong, try again.')
    else:  # 如果發現使用者名稱不存在
        is_sign_up = tkinter.messagebox.askyesno('Welcome! ', 'You have not sign up yet. Sign up now?')
        # 提示需不需要註冊新使用者
        if is_sign_up:
            usr_sign_up()

# 第9步,定義使用者註冊功能
def usr_sign_up():
    def sign_to_Hongwei_Website():
        # 以下三行就是獲取我們註冊時所輸入的資訊
        np = new_pwd.get()
        npf = new_pwd_confirm.get()
        nn = new_name.get()

        # 這裡是開啟我們記錄資料的檔案,將註冊資訊讀出
        with open('usrs_info.pickle', 'rb') as usr_file:
            exist_usr_info = pickle.load(usr_file)
        # 這裡就是判斷,如果兩次密碼輸入不一致,則提示Error, Password and confirm password must be the same!
        if np != npf:
            tkinter.messagebox.showerror('Error', 'Password and confirm password must be the same!')

        # 如果使用者名稱已經在我們的資料檔案中,則提示Error, The user has already signed up!
        elif nn in exist_usr_info:
            tkinter.messagebox.showerror('Error', 'The user has already signed up!')

        # 最後如果輸入無以上錯誤,則將註冊輸入的資訊記錄到檔案當中,並提示註冊成功Welcome!,You have successfully signed up!,然後銷燬視窗。
        else:
            exist_usr_info[nn] = np
            with open('usrs_info.pickle', 'wb') as usr_file:
                pickle.dump(exist_usr_info, usr_file)
            tkinter.messagebox.showinfo('Welcome', 'You have successfully signed up!')
            # 然後銷燬視窗。
            window_sign_up.destroy()

    # 定義長在視窗上的視窗
    window_sign_up = tk.Toplevel(window)
    window_sign_up.geometry('300x200')
    window_sign_up.title('Sign up window')

    new_name = tk.StringVar()  # 將輸入的註冊名賦值給變數
    new_name.set('[email protected]')  # 將最初顯示定為'[email protected]'
    tk.Label(window_sign_up, text='User name: ').place(x=10, y=10)  # 將`User name:`放置在座標(10,10)。
    entry_new_name = tk.Entry(window_sign_up, textvariable=new_name)  # 建立一個註冊名的`entry`,變數為`new_name`
    entry_new_name.place(x=130, y=10)  # `entry`放置在座標(150,10).

    new_pwd = tk.StringVar()
    tk.Label(window_sign_up, text='Password: ').place(x=10, y=50)
    entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*')
    entry_usr_pwd.place(x=130, y=50)

    new_pwd_confirm = tk.StringVar()
    tk.Label(window_sign_up, text='Confirm password: ').place(x=10, y=90)
    entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')
    entry_usr_pwd_confirm.place(x=130, y=90)

    # 下面的 sign_to_Hongwei_Website
    btn_comfirm_sign_up = tk.Button(window_sign_up, text='Sign up', command=sign_to_Hongwei_Website)
    btn_comfirm_sign_up.place(x=180, y=120)

# 第7步,login and sign up 按鈕
btn_login = tk.Button(window, text='Login', command=usr_login)
btn_login.place(x=120, y=240)
btn_sign_up = tk.Button(window, text='Sign up', command=usr_sign_up)
btn_sign_up.place(x=200, y=240)

# 第10步,主視窗迴圈顯示
window.mainloop()

  測試效果:

15. 其他部件後續再補充...

 注:不同電腦可能配置環境略有不同,如有小錯誤可以自己除錯一下。