2020年9月12日星期六

68 《零基礎入門學習Python》筆記 第068講:GUI的終極選擇:Tkinter5

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


這節課的主要內容為  Listbox組件、Scrollbar組件和Scale組件

在之前的學習中,我們已經知道了,如果說提供選項給客戶選擇,那麼有兩種情況,單選的話,我們用Radiobutton,多選的話,用Checkbutton,如果說提供的選項非常多,比如說選擇你所在的城市,那麼全國有好幾百個城市,使用RadiobuttonCheckbutton這些組件直接導致的結果就是用戶的界面根本就不夠存放那麼多按鈕,這時候你就可以考慮使用我們今天要介紹的Listbox組件。

一、Listbox 組件

Listbox 是用列錶框的形式給顯示出來的,並且支持滾動條操作,所以對於諸如提供大量的選項這樣的情況會更適用一些。
我們先來舉個簡單的例子:
  1. import tkinter as tk
  2. master = tk.Tk()
  3. theLB = tk.Listbox (master)
  4. theLB.pack()
  5. master.mainloop()
運行一下:
如你所見,剛開始創建出來的時候,是空的,裡面什麼都沒有,沒有任何選項,所以我們要做的第一件事就是給它添加選項,添加選項同樣是用insert() 方法, insert() 方法有兩個參數,第一個參數就是添加的位置,第二個參數就是添加的內容。
  1. import tkinter as tk
  2. master = tk.Tk()
  3. theLB = tk.Listbox (master)
  4. theLB.pack()
  5. theLB.insert(0, "Python")
  6. master.mainloop()
這就有一個選項了,我們接著添加,你這裡可以使用"end", "end" 表示最後一個位置。
  1. theLB.insert(0, "Python")
  2. theLB.insert("end", "来自江南的你")
當然啦,對於特別多的選項,我們肯定不建議這樣做,我們用循環。
  1. import tkinter as tk
  2. master = tk.Tk()
  3. theLB = tk.Listbox (master)
  4. theLB.pack()
  5. for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋", "蛋蛋"]:
  6. theLB.insert("end", item)
  7. master.mainloop()
有插入就肯定有刪除,刪除的話,我們還是使用delete() 方法,它有兩個參數,第一個是起始位置,第二個是結束位置。如果只給定一個參數的話,就是指定這個參數對應的項目。
  1. for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋", "蛋蛋"]:
  2. theLB.insert("end", item)
  3. theLB.delete(1)
我們經常要做的就是選中哪一個,就刪除哪一個。我們現在做一個例子,我們添加一個獨立的按鈕,作用就是刪除用戶選中的項目。
  1. import tkinter as tk
  2. master = tk.Tk()
  3. theLB = tk.Listbox (master)
  4. theLB.pack()
  5. for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋", "蛋蛋"]:
  6. theLB.insert("end", item)
  7. theButton = tk.Button(master, text = "删除",\
  8. command = lambda x = theLB : x.delete("active")) #"active"就是选中的选项
  9. theButton.pack()
  10. master.mainloop()
運行:
   
最後我們要說的就是Listbox組件根據selectmode選項提供了四種不同的選擇模式:"single"(單選)、"browse"(也是單選,但拖動鼠標或通過方向鍵可以直接改變選項)、 "multiple"(多選)和"extended"(也是多選,但需要同時按住Shift鍵或Ctrl鍵或拖拽鼠標實現)。默認是"browse"。
  1. theLB = tk.Listbox (master, selectmode = "extended")
  2. theLB.pack()
大家可以每一個都試一下,感受一下效果。
選項一多啊,麻煩事就接踵而來,比如說,你發現Listbox 默認只能顯示10個項目,但是你手頭有11 個項目,那怎麼辦?
我們來試一下:
  1. import tkinter as tk
  2. master = tk.Tk()
  3. theLB = tk.Listbox (master, selectmode = "extended")
  4. theLB.pack()
  5. for item in range(11):
  6. theLB.insert("end", item)
  7. master.mainloop()
只能通過鼠標滾輪才能迫使最後一個項目現身,這樣子做往往很容易被用戶所忽略。你又沒有說下面有東西,誰知道呢?
這樣的情況,有兩種方法來解決這種尷尬。
第一個方法就是修改height 選項。

height 選項用法

1.設置Listbox顯示的行數(不是像素)
2.默認值是10
我們可以改一下:
theLB = tk.Listbox (master, selectmode = "extended", height = 11)
這樣子就沒問題了。
修改height 選項的方法雖然可以達到我們的目的,但是如果項目太多,比如說我們要顯示1000 個,這個方法顯然就不適用了。
還有一個更加靈活的方法就是為Listbox 添加滾動條。

二、Scrollbar 組件

我們接著就來談談滾動條組件。滾動條雖然是一個獨立的組件存在,但它幾乎都是與其他組件配合使用。下面的例子我們演示如何使用垂直滾動條。
為了在某個組件上安裝滾動條,你必須要做兩件事:
1、設置該組件的xscrollbarcommand 或者yscrollbarcommand 選項為Scrollbar 組件的set() 方法。
2、設置Scrollbar 組件的command 選項為該組件的xview() 或者yview() 方法。
說起來比較複雜,但做起來很簡單,我們先來搞個滾動條出來:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. sb = tk.Scrollbar(root)
  4. sb.pack()
  5. root.mainloop()
運行一下:

我們要把它填充到右邊的位置:
sb.pack(side = "right", fill = "y")
然後我們就來增加一個Listbox:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. sb = tk.Scrollbar(root)
  4. sb.pack(side = "right", fill = "y")
  5. lb = tk.Listbox(root, yscrollcommand = sb.set)
  6. for i in range(200):
  7. lb.insert("end", i)
  8. lb.pack(side = "left", fill = "both")
  9. sb.config(command = lb.yview)
  10. root.mainloop()
運行一下:
工作原理:這事實上就是一個互聯互通的過程,當用戶操作滾動條進行滾動的時候,滾動條首先響應用戶的滾動操作,接下來,通過yview() 方法(Listbox 的內置方法),內容就會自動刷新,然後,如果是Listbox 藜裡面滾動,它就會調用sb.set() 方法,同時修改滾動條的位置。

三、Scale 組件

既然說到滾動條,我們就來順帶說一下跟滾動條長得很相似的一個組件,叫做Scale 組件。
我們先來看一下它是什麼樣的:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. tk.Scale(root).pack()
  4. root.mainloop()
雖然它和滾動條長得像,同樣都可以滾,都有滑塊,都是條形的,但是它們的應用範圍可是不一樣的。Scale 組件主要是通過滑塊來表示某個範圍內的一個數字,你可以通過修改選項、設置範圍以及分辨率(分辨率就是指的步長)。
我們來舉個例子:
當你希望用戶輸入某個範圍內的一個數字的時候,你可能會使用Entry 組件,但是Entry 組件不能限制一個範圍,你只能給出提示,然後對得到的數字進行檢測,這樣不方便。你可以直接弄一個Scale 組件,提供一個範圍,然後用戶就只能在這個範圍內選擇。
  1. import tkinter as tk
  2. root = tk.Tk()
  3. tk.Scale(root, from_= 0, to = 52).pack()
  4. tk.Scale(root, from_= 0, to = 200, orient = 'horizontal').pack() #orient = 'horizontal' 设置为水平,默认"vertical"是垂直
  5. root.mainloop()
獲取滑塊當前的位置,我們使用的是get()方法,我們增加一個按鈕,來試驗一下:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. s1 = tk.Scale(root, from_= 0, to = 52)
  4. s1.pack()
  5. s2 = tk.Scale(root, from_= 0, to = 200, orient = 'horizontal')
  6. s2.pack()
  7. def show():
  8. print(s1.get(), s2.get())
  9. tk.Button(root, text = "获取位置", command = show).pack()
  10. root.mainloop()
接下來,你還可以通過resolution 選項來控制它的步長,也就是精度;使用 tickinterval 選項顯示刻度。
  1. import tkinter as tk
  2. root = tk.Tk()
  3. tk.Scale(root, from_= 0, to = 52, tickinterval = 5, resolution = 5, length = 200).pack()
  4. tk.Scale(root, from_= 0, to = 200, tickinterval = 10, orient = 'horizontal', length = 600).pack()
  5. root.mainloop()
為了讓所有的刻度都能夠排列下去,我們通過length 選項設置 Scale 組件的長度為200 和600 像素。


0 留言:

發佈留言