OptionMenu 下拉选单
OptionMenu 是 tkinter 里用来让用户可以使用“下拉选单”进行选取特定的选项,这篇教学会介绍如何在 tkinter 视窗里加入 OptionMenu 下拉选单,并实作选取后进行互动的程序。
快速导览:
因为 Google Colab 不支援 tkinter,所以请使用本机环境 ( 参考:使用 Python 虚拟环境 ) 或使用 Anaconda Jupyter 进行实作 ( 参考:使用 Anaconda )。
加入 OptionMenu
建立 tkinter 视窗对象后,透过 OptionMenu 方法,就能在视窗对象中建立 OptionMenu 下拉选单,必要的参数有三个,第一个表示要加入的视窗对象,第二个是 tk 变数,表示选单选择以及显示的项目,第三个开始是选单内容 ( 参考 pack 参数设定 ),下方的程序码执行后,会在视窗里加入一个具有五个选项的 OptionMenu ( 位置、大小和颜色都使用默认值 )。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
optionList = ['七龍珠','海賊王','鬼滅之刃','灌籃高手','排球少年'] # 選項
value = tk.StringVar() # 取值
value.set('')
menu = tk.OptionMenu(root, value, *optionList) # 第二個參數是取值,第三個開始是選項,使用星號展開
menu.pack()
root.mainloop()
OptionMenu 参数设定
加入 OptionMenu 之后,可以透过 OptionMenu 的参数调整内容的样式,下方列出 OptionMenu 和其他元件相同的参数:
| 参数 | 说明 |
|---|---|
| anchor | 摆放位置,可以设定 n、s、w、e、ne、nw、sw、se、center ( e 右,w 左,s 下,n 上 ),默认 center。 |
| width | 宽度,单位是字元数。 |
| height | 高度,单位是字元数。 |
| bg/background | 背景颜色,可以使用十六进制色码或颜色名称。 |
| fg/foreground | 文字颜色,可以使用十六进制色码或颜色名称。 |
OptionMenu 操作方法
OptionMenu 操作方法和其他元件的用法不同,必须要在外部建立一个变数,透过变数 trace 的方式取值,trace 有两个参数,第一个是追踪的模式,第二个是追踪事件发生后要执行的函数,追踪模式如下:
| 模式 | 说明 |
|---|---|
| w | 当选单的值被更改或选择。 |
| r | 当选单被读取。 |
| u | 当选单被删除。 |
此外,也因为 OptionMenu 的参数已经提供给选单“内容”使用,因此如果要改变样式,则必须透过 config 的方式设定,下方的程序执行后,会在选择 OptionMenu 选项时,印出所选的内容。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
def show(*e):
a.set(value.get()) # Label 變數改變成選單內容,使用 get() 取值
a = tk.StringVar() # Label 變數
a.set('七龍珠')
label = tk.Label(root, textvariable=a) # 建立 Label,文字為變數
label.pack()
optionList = ['七龍珠','海賊王','鬼滅之刃','灌籃高手','排球少年']
value = tk.StringVar()
value.set('七龍珠')
menu = tk.OptionMenu(root, value, *optionList) # 選單
menu.config(width=10, fg='#f00') # 設定樣式
menu.pack()
value.trace('w', show) # 變數 trace 是否改變,若有改變執行 show
root.mainloop()
显示 OptionMenu 选取内容
如果不想用 trace 的方式,也可改用单纯点击 Button 后执行函数的做法,就可以在选单变更后,点击按钮显示选择内容。
import tkinter as tk
root = tk.Tk()
root.title('oxxo.studio')
root.geometry('200x200')
def show(*e):
a.set(value.get())
a = tk.StringVar()
a.set('')
label = tk.Label(root, textvariable=a)
label.pack()
optionList = ['七龍珠','海賊王','鬼滅之刃','灌籃高手','排球少年']
value = tk.StringVar()
value.set('七龍珠')
menu = tk.OptionMenu(root, value, *optionList)
menu.config(width=10, fg='#f00')
menu.pack()
button = tk.Button(root, text='顯示', command=show)
button.pack()
root.mainloop()
微信扫码关注
抖音扫码关注