首先导入tkinter组件,建立root窗口,放置标签。因为tkinter自带的OptionMenu组件比较丑,所以这里使用tkinter.ttk模块提供的OptionMenu组件进行演示,需要先导入tkinter.ttk模块。tkinter与tkinter.ttk模块提供的OptionMenu组件使用方法基本相同。
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("PRTS")
root.geometry("240x150")
tk.Label(root, text="基于OptionMenu的下拉菜单示例").pack(pady=10)
root.mainloop()
接下来新建OptionMenu组件。其中,tk.StringVar类型变量v是显示在菜单输入框中的文字,v后边的第一个变量是菜单输入框中默认显示的变量,之后的字符串序列是菜单可以选择的输入变量。
v = tk.StringVar(root)
dropdownmenu = tk.ttk.OptionMenu(root, v, "(空)", "史尔特尔", "艾雅法拉", "伊芙利特")
接下来是编写修改下拉菜单列表的函数
首先,使用'menu'
作为键名索引下拉菜单,并使用.delete()
方法删除不需要的菜单,全部删除可使用.delete(0, 'end')
代码。
接下来使用.add_command(label=op, command=lambda x=op: v.set(x))
方法新增菜单选项。label
是菜单选项显示的字,command
是点击选项后执行的函数,因为我们需要用菜单输入框显示我们点击的选项,因此我们需要在点击选项后将选项的文字信息填写到tk.StringVar
类型变量v
中。这里使用lambda
方法构造匿名函数。
代码如下:
def set_optionmenu(opl:list):
dropdownmenu['menu'].delete(0, 'end')
for op in opl:
dropdownmenu['menu'].add_command(label=op, command=lambda x=op: v.set(x))
v.set("(空)")#设置更新菜单后默认显示的选项
接下来放置按键组件,使用lambda
方法构造匿名函数,将新的下拉菜单列表通过刚刚配置好的set_optionmenu
函数传入OptionMenu中。
setbutton = tk.Button(root, text="更新干员名单", command=lambda: set_optionmenu(newlist))
newlist = ["克洛斯", "芬", "芙蓉"]
setbutton.pack()
最后放置一个按键,在控制台输出OptionMenu选中的数据
tk.Button(root, text="输出你的选择", command=lambda: print("你选择的干员是:"+v.get())).pack()
运行结果如下:
原始下拉菜单:
点击“更新干员名单”按键,获得新的下拉菜单
控制台输出结果:
完整代码如下:
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
root.title("PRTS")
root.geometry("240x150")
tk.Label(root, text="基于OptionMenu的下拉菜单示例").pack(pady=10)
v = tk.StringVar(root)
dropdownmenu = tk.ttk.OptionMenu(root, v, "(空)", "史尔特尔", "艾雅法拉", "伊芙利特")
dropdownmenu.pack(fill="x")
def set_optionmenu(opl:list):
dropdownmenu['menu'].delete(0, 'end')
for op in opl:
dropdownmenu['menu'].add_command(label=op, command=lambda x=op: v.set(x))
v.set("(空)")
setbutton = tk.Button(root, text="更新干员名单", command=lambda: set_optionmenu(newlist))
newlist = ["克洛斯", "芬", "芙蓉"]
setbutton.pack()
tk.Button(root, text="输出你的选择", command=lambda: print("你选择的干员是:"+v.get())).pack()
root.mainloop()
主要参考资料:python中tkinter 对话框里面的OptionMenu下拉内容动态变化_raynfeild的博客-CSDN博客_tkinter下拉菜单动态数据