1. 程式人生 > >《零基礎入門學習Python》第066講:GUI的終極選擇:Tkinter3

《零基礎入門學習Python》第066講:GUI的終極選擇:Tkinter3

今天我們一起來學習三個元件:CheckbuttonRadiobuttonLabelFrame

同樣,我們還是通過案例來講解。

一、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()

執行結果如下: