2020年9月12日星期六

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

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


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

一、Checkbutton

Checkbutton(多選框)。大家都知道什麼叫做“翻牌子”,今天的第一個例子就是來寫一個翻牌子的程序。
Checkbutton 就是我們常見的多選框按鈕,而下面要講的 Radiobutton 就是單選框按鈕。那大家覺得翻牌子程序應該是使用 Checkbutton 還是 Radiobutton 來實現呢?我個人認為哈,應該是 Checkbutton 。
我們首先來測試一下 Checkbutton ,來感受一下它的用法:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. v = tk.IntVar() #设置一个tk 变量用于表示按钮是否被选中,这里用整型变量 IntVar
  4. c = tk.Checkbutton(root, text= "测试一下", variable = v)
  5. c.pack()
  6. root.mainloop
運行結果如下:
沒有按按鈕時: ->          點下按鈕的時候:->  
當我們點下按鈕的時候,這個框框裡會出現一個小勾,為了更直觀的讓大家知道選中和未選中時v 的表現狀態,我們可以把它顯示出來,顯示在Label 標籤裡面。
  1. import tkinter as tk
  2. root = tk.Tk()
  3. v = tk.IntVar() #设置一个tk 变量用于表示按钮是否被选中,这里用整型变量 IntVar
  4. c = tk.Checkbutton(root, text= "测试一下", variable = v)
  5. c.pack()
  6. l = tk.Label(root, textvariable = v)
  7. l.pack()
  8. root.mainloop
運行結果如下:
沒有選中時: ->          選中的時候:->  
有了這樣的基礎,我們就可以來寫我們的翻牌子程序了。
  1. import tkinter as tk
  2. root = tk.Tk()
  3. GIRLS = ["西施", "貂蝉", "王昭君", "杨玉环"]
  4. v = []
  5. for girl in GIRLS:
  6. v.append(tk.IntVar())
  7. b = tk.Checkbutton(root, text = girl, variable = v[-1])
  8. b.pack()
  9. 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選項的值。
我們通過代碼來講解:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. v = tk.IntVar()
  4. tk.Radiobutton(root, text = "One", variable = v, value = 1).pack(anchor = "w")
  5. tk.Radiobutton(root, text = "Two", variable = v, value = 2).pack(anchor = "w")
  6. tk.Radiobutton(root, text = "Three", variable = v, value = 3).pack(anchor = "w")
  7. root.mainloop()
運行結果如下:

這裡有兩點需要注意的:

1、variable 選項只能設置為同一個變量,這裡都是v;
2、value 選項的值一定要不同,才能實現互測。
Radiobutton 的原理就是:你每一次點中一個按鈕,它就會把這個按鈕的value 給v,然後根據v 的值來選中對應的框。
同樣的,如果你有多個選項的話,我們仍然可以使用循環,使得代碼更加簡潔:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. LANGS = [
  4. ("Python", 1),
  5. ("Perl", 2),
  6. ("Ruby", 3),
  7. ("Lua", 4),
  8. ("C++", 5)]
  9. v = tk.IntVar()
  10. v.set(1)
  11. for lang, num in LANGS:
  12. b = tk.Radiobutton(root, text = lang, variable = v, value = num)
  13. b.pack(anchor = "w")
  14. root.mainloop()
運行結果如下:
有人要提意見了:“我不喜歡前面的小圓圈,我有圓形恐懼症!”
沒問題,我們只需要加一個選項indicatoron = Falseindicatoron就是指示器,就是前面的小圓圈,把它設置為False,就不會顯示了。
  1. b = tk.Radiobutton(root, text = lang, variable = v, value = num, indicatoron = False)
  2. b.pack(anchor = "w")
如下:
這樣不美觀,我們可以橫向填充按鈕。
  1. b = tk.Radiobutton(root, text = lang, variable = v, value = num, indicatoron = False)
  2. b.pack(fill = "x")

三、LabelFrame

LabelFrame(標籤框架),這實際上是Frame 框架的進化版,從形態上來說,也就是添加了Label 的Frame,但是有了它,Checkbutton 和Radiobutton 的分組就變得簡單了。
  1. import tkinter as tk
  2. root = tk.Tk()
  3. group = tk.LabelFrame(root, text = "最好的脚本语言是:", padx = 5, pady =5)
  4. group.pack(padx = 10, pady = 10)
  5. LANGS = [
  6. ("Python", 1),
  7. ("Perl", 2),
  8. ("Ruby", 3),
  9. ("Lua", 4),
  10. ("C++", 5)]
  11. v = tk.IntVar()
  12. for lang, num in LANGS:
  13. b = tk.Radiobutton(group, text = lang, variable = v, value = num)
  14. b.pack(anchor = "w")
  15. root.mainloop()
運行結果如下:



0 留言:

發佈留言