《零基礎入門學習Python》第066講:GUI的終極選擇:Tkinter3
今天我們一起來學習三個元件:Checkbutton、Radiobutton 和 LabelFrame。
同樣,我們還是通過案例來講解。
一、Checkbutton
Checkbutton(多選框)。大家都知道什麼叫做“翻牌子”,今天的第一個例子就是來寫一個翻牌子的程式。
Checkbutton 就是我們常見的多選框按鈕,而 下面要講的 Radiobutton 就是單選框按鈕。那大家覺得 翻牌子 程式應該是使用 Checkbutton 還是 Radiobutton 來實現呢?我個人認為哈,應該是 Checkbutton 。
我們首先來測試一下 Checkbutton ,來感受一下 它的用法:
import tkinter as tk
root = tk.Tk()
v = tk.IntVar() #設定一個tk 變數用於表示按鈕是否被選中,這裡用整型變數 IntVar
c = tk.Checkbutton(root, text= "測試一下", variable = v)
c.pack()
root.mainloop
執行結果如下:
沒有按按鈕時: -> 點下按鈕的時候:->
當我們點下按鈕的時候,這個框框裡會出現一個小勾,為了更直觀的讓大家知道選中和未選中時 v 的表現狀態,我們可以把它顯示出來,顯示在 Label 標籤裡面。
import tkinter as tk
root = tk.Tk()
v = tk.IntVar() #設定一個tk 變數用於表示按鈕是否被選中,這裡用整型變數 IntVar
c = tk.Checkbutton(root, text= "測試一下", variable = v)
c.pack()
l = tk.Label(root, textvariable = v)
l.pack()
root.mainloop
執行結果如下:
沒有選中時: -> 選中的時候:->
有了這樣的基礎,我們就可以來寫我們的翻牌子程式了。
import tkinter as tk
root = tk.Tk()
GIRLS = ["西施", "貂蟬", "王昭君", "楊玉環"]
v = []
for girl in GIRLS:
v.append(tk.IntVar())
b = tk.Checkbutton(root, text = girl, variable = v[-1])
b.pack()
root.mainloop
執行結果如下:
我們希望把所有的 Checkbotton 左對齊:
通過設定 pack 的 anchor 選項,就可以實現了。 anchor 選項 是用於制定顯示位置的。
anchor 用法:
1. 控制文字(或影象)在 Button 中顯示的位置
2. "n", "ne", "e", "se", "s", "sw", "w", "nw", 或者 "center" 來定位(ewsn 代表東西南北,上北下南左西右東)
3. 預設值是 "center"
b.pack(anchor = "w")
二、Radiobutton
Radiobutton(單選框),Radiobutton 的用法和 Checkbutton 的用法基本一致,唯一不同的就是 Radiobutton 要實現單選的效果,就是需要同一組內所有的 Radiobutton 只能共享一個 variable 選項,並且需要設定不同的 value 選項的值。
我們通過程式碼來講解:
import tkinter as tk
root = tk.Tk()
v = tk.IntVar()
tk.Radiobutton(root, text = "One", variable = v, value = 1).pack(anchor = "w")
tk.Radiobutton(root, text = "Two", variable = v, value = 2).pack(anchor = "w")
tk.Radiobutton(root, text = "Three", variable = v, value = 3).pack(anchor = "w")
root.mainloop()
執行結果如下:
這裡有兩點需要注意的:
1、variable 選項只能設定為同一個變數,這裡都是 v;
2、value 選項的值 一定要不同,才能實現互測。
Radiobutton 的原理就是:你每一次點中一個按鈕,它就會把這個按鈕的 value 給 v,然後根據 v 的值來選中對應的框。
同樣的,如果你有多個選項的話,我們仍然可以使用迴圈,使得程式碼更加簡潔:
import tkinter as tk
root = tk.Tk()
LANGS = [
("Python", 1),
("Perl", 2),
("Ruby", 3),
("Lua", 4),
("C++", 5)]
v = tk.IntVar()
v.set(1)
for lang, num in LANGS:
b = tk.Radiobutton(root, text = lang, variable = v, value = num)
b.pack(anchor = "w")
root.mainloop()
執行結果如下:
有人要提意見了:“我不喜歡前面的小圓圈,我有圓形恐懼症!”
沒問題,我們只需要加一個選項 indicatoron = False。(indicatoron 就是指示器,就是前面的小圓圈,把它設定為 False,就不會顯示了。)
b = tk.Radiobutton(root, text = lang, variable = v, value = num, indicatoron = False)
b.pack(anchor = "w")
如下:
這樣不美觀,我們可以橫向填充按鈕。
b = tk.Radiobutton(root, text = lang, variable = v, value = num, indicatoron = False)
b.pack(fill = "x")
三、LabelFrame
LabelFrame(標籤框架),這實際上是 Frame 框架的進化版,從形態上來說,也就是添加了 Label 的 Frame,但是有了它,Checkbutton 和 Radiobutton 的分組就變得簡單了。
import tkinter as tk
root = tk.Tk()
group = tk.LabelFrame(root, text = "最好的指令碼語言是:", padx = 5, pady =5)
group.pack(padx = 10, pady = 10)
LANGS = [
("Python", 1),
("Perl", 2),
("Ruby", 3),
("Lua", 4),
("C++", 5)]
v = tk.IntVar()
for lang, num in LANGS:
b = tk.Radiobutton(group, text = lang, variable = v, value = num)
b.pack(anchor = "w")
root.mainloop()
執行結果如下: