添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Listbox 列表選擇框

Listbox 是 tkinter 裡用來讓使用者可以從一串清單裡選擇的「列表輸入框」,這篇教學會介紹如何在 tkinter 視窗裡加入 Listbox 列表選擇框,並實作輸入資料後進行互動的程式。

快速導覽:

  • 加入 Listbox
  • Listbox 參數設定
  • Listbox 操作方法
  • 一次添加多個選項
  • 點擊按鈕,顯示清單選擇項目
  • Listbox 加入捲軸
  • 因為 Google Colab 不支援 tkinter,所以請 使用本機環境 ( 參考: 使用 Python 虛擬環境 ) 或 使用 Anaconda Jupyter 進行實作 ( 參考: 使用 Anaconda )。

    加入 Listbox

    建立 tkinter 視窗物件後, 透過 Listbox 方法,就能在視窗物件中建立 Listbox 列表選擇框 ,必要的參數有一個,第一個表示要加入的視窗物件, 建立 Listbox 後使用 insert() 方法加入選項,最後再用 pack() 方法將其加入視窗中 ( 參考 pack 參數設定 ),下方的程式碼執行後,會在視窗裡加入一個具有三個選項的 Listbox ( 位置、大小和顏色都使用預設值 )。

    import tkinter as tk
    root = tk.Tk()
    root.title('oxxo.studio')
    root.geometry('200x200')
    listbox = tk.Listbox(root)    # 放入列表選擇框
    listbox.insert(1, 'Apple')    # 第一個選項
    listbox.insert(2, 'Banana')   # 第二個選項
    listbox.insert(3, 'Orange')   # 第三個選項
    listbox.pack()
    root.mainloop()
    

    insert 的第一個參數為選項的位置,如果不知道位置但又希望選項按照順序插入,可以 使用 tk.END 作為順序,就會將選項依序放在最後,如果使用 0,就會從第一個位置插入

    import tkinter as tk
    root = tk.Tk()
    root.title('oxxo.studio')
    root.geometry('200x200')
    listbox = tk.Listbox(root)         # 放入列表選擇框
    listbox.insert(tk.END, 'Apple')    # 第一個選項
    listbox.insert(tk.END, 'Banana')   # 第二個選項
    listbox.insert(tk.END, 'Orange')   # 第三個選項
    listbox.pack()
    root.mainloop()
    selectmode
    選取模式,可以設定 browse ( 預設,等同單選 )、single ( 單選 )、multiple ( 多選 ) 和 extended ( 等同多選,但可用滑鼠拖曳選取 )。
    selectbackground
    選取時的背景色。
    xscrollcommand
    與 set() 方法搭配,將 Listbox 加上水平捲軸。
    yscrollcommand
    與 set() 方法搭配,將 Listbox 加上垂直捲軸。
    

    Listbox 操作方法

    透過下列方法,可以進行 Listbox 列表選擇框的相關操作:

    insert() index, option 在指定位置 ( index ) 加入選項 ( option )。 delete() first, last=None 刪除 first 到 last 之間的項目,如果沒有 last 則只會刪除 first 的項目。 get() first, last=None 取得 first 到 last 之間的項目,如果沒有 last 則只會取得 first 的項目。 size() 回傳項目總數。 curselection() 以 tuple 格式回傳選取的項目索引。 activate() index 選取 index 項目。 selection_set() index 設定 index 項目為被選取的狀態。 selection_includes() index 檢查 index 項目是否有被選取。 listbox = tk.Listbox(root) menu = ['Apple','Banana','Orange','Grap','Papaya','Coconut'] # 建立選單的串列 for i in menu: listbox.insert(tk.END, i) # 使用 for 迴圈添加選項 listbox.pack() root.mainloop()

    除了使用迴圈,也可以透過 listvariable 指定變數,當變數內容為清單項目時,就會自動將清單項目加入。

    import tkinter as tk
    root = tk.Tk()
    root.title('oxxo.studio')
    root.geometry('200x200')
    menu = tk.StringVar()    # 設定 tk 文字變數
    menu.set(('Apple','Banana','Orange','Grap','Papaya','Coconut'))  # 加入清單內容
    listbox = tk.Listbox(root,  listvariable=menu)  # 設定 listvariable=a
    listbox.pack()
    root.mainloop()
    

    點擊按鈕,顯示清單選擇項目

    參考「Label 標籤」和「Button 按鈕」文章,搭配 Listbox 的 curselection() 取得選取項目以及 get() 取得項目內容,就能在點擊按鈕時,透過 Label 顯示 Listbox 選取的項目。

    import tkinter as tk
    root = tk.Tk()
    root.title('oxxo.studio')
    root.geometry('200x200')
    # 定義 Label 顯示選取內容的函式
    def show():
        n, = listbox.curselection()  # 取得項目索引值,因為是單選,回傳 (i,),所以使用 n, 取值
        text.set(listbox.get(n))     # 設定文字變數內容為該索引值對應的內容
    text = tk.StringVar()            # 設定文字變數
    label = tk.Label(root, textvariable=text)  # 放入 Label
    label.pack()
    menu = tk.StringVar()
    menu.set(('Apple','Banana','Orange','Grap','Papaya','Coconut'))
    listbox = tk.Listbox(root,  listvariable=menu, height=8)
    listbox.pack()
    btn = tk.Button(root, text='顯示', command=show)  # 放入 Button,設定 command 參數
    btn.pack()
    

    Listbox 加入捲軸

    Listbox 要加入捲軸比較複雜,需要先添加 Frame 頁框元件,再將 Listbox 和額外添加的 Scrollbar 捲軸元件放在 Frame 頁框裡,接著將 Listbox 和 Scrollbar 綁定,就能實現 Listbox 捲軸效果。

    import tkinter as tk
    root = tk.Tk()
    root.title('oxxo.studio')
    root.geometry('200x200')
    frame = tk.Frame(root, width=15)        # 加入頁框元件,設定寬度
    frame.pack()
    scrollbar = tk.Scrollbar(frame)         # 在頁框中加入捲軸元件
    scrollbar.pack(side='right', fill='y')  # 設定捲軸的位置以及填滿方式
    menu = tk.StringVar()
    menu.set(('Apple','Banana','Orange','Grap','Papaya','Coconut','Pear','Nuts'))
    # 在頁框中加入 Listbox 元件,設定 yscrollcommand = scrollbar.set
    listbox = tk.Listbox(frame,  listvariable=menu, height=6, width=15, yscrollcommand = scrollbar.set)
    listbox.pack(side='left', fill='y')    # 設定 Listbox 的位置以及填滿方式
    scrollbar.config(command = listbox.yview)  # 設定 scrollbar 的 command = listbox.yview
    root.mainloop()
              

    如果有任何建議或問題,可傳送「意見表單」給我,謝謝~