當某個欄位的值只能限定在幾個固定選項裡(例如性別只能是FM、縣市只能是台灣的幾個城市),若用〈7. Radiobutton 選項按鈕元件〉逐一列出每個選項,選項一多畫面就會被占滿;這種情況更適合使用Combobox下拉式選單,把所有選項收合在一個下拉清單裡,使用者點開後選取其中一項即可,比較省版面。Comboboxttk模組提供的元件(tkinter本身沒有),建立語法如下:

物件變數 = ttk.Combobox(容器物件, [參數1=值1, 參數2=值2, …, 參數n=值n])

常用參數

參數說明
values設定下拉清單中的選項內容,型別為串列(list),例如values=['F', 'M']
textvariable代表下拉選單目前選取值的物件,用法與Entrytextvariable相同,須先用tkinter模組的StringVar()等方法定義變數,再透過var.get()取得目前選取的值,var.set(值)可用程式指定選取的值。可參考〈5. Entry 文字方塊元件〉。
width設定下拉選單的寬度。
state設定下拉選單的狀態,預設值'normal'表示使用者除了下拉選取,也可以自行在欄位中輸入文字;設為'readonly'表示唯讀,使用者只能從values清單中挑選,無法自行輸入其他字串(常用於避免使用者輸入不在允許範圍內的值,例如資料庫欄位限定只能存ENUM('F','M')時)。

Combobox綁定了textvariable之後,除了透過變數的get()set()存取目前選取值,元件本身也提供對應的get()set()方法可以直接使用,兩種寫法效果相同:

vSex = var_sex.get()      # 透過變數取得目前選取值
vSex = cboSex.get()       # 或直接呼叫 Combobox 物件的 get()

[簡例] 建立城市下拉選單,預設選取台北市,選取後按下[確定]鈕以對話方塊顯示選取的城市。(檔名:combobox01.py)

[結果]
(可自行執行程式碼查看畫面:下拉選單預設顯示「台北市」,點開後可選取其他四個城市。)

說明

  1. 14行:建立city這個tk.StringVar()物件,並在建立時透過value='台北市'指定預設選取值。
  2. 15~18行:建立cboCity下拉選單,values指定五個城市選項,textvariable=city把選單與city變數綁定,state='readonly'限制使用者只能從清單中選取,不能自行輸入其他文字。
  3. 4~5行:定義fnOk()函式,用city.get()取得目前選取的城市並顯示於對話方塊。

在 student_crud.py 的應用

student_crud.py_build_form()方法中,「性別」欄位就是用Combobox限定只能選FM,對應資料表cSex欄位為ENUM('F','M')的設計:

self.var_sex = tk.StringVar(value='F')
ttk.Combobox(row0, textvariable=self.var_sex, values=['F', 'M'], width=5, state='readonly').pack(side='left', padx=5)

因為資料庫欄位限定只能存'F''M',所以用state='readonly'避免使用者透過鍵盤輸入這兩個值以外的文字,寫入資料庫時觸發錯誤。


相關主題與延伸閱讀