使用枚举的 Tkinter 下拉选项菜单
Tkinter Dropdown options menu using Enum
我正在尝试制作一个 window 来保存对象的所有当前数据,并允许我更改它。我坚持如何让选项菜单保存枚举值并将选择保存为正确的枚举键。
这是我当前的代码,在单击按钮时被调用:
current = tk.StringVar()
current .set(self.CustomEnum.value)
tk.OptionMenu(infoMenu, current, [e.value for e in CustomEnum]).pack()
这是列表理解的结果:
['Option 1', 'Option 2', 'Option 3']
我更专注于让它正确显示,因为现在菜单中的唯一选项是
Option1 {Option 2} {Option 3}
最小可重现示例:
import tkinter as tk
from enum import Enum
window = tk.Tk()
class CustomEnum(Enum):
Option1 = "Option1"
Option2 = "Option2"
current = tk.StringVar()
current .set(CustomEnum.Option1.value)
tk.OptionMenu(window, current, [e.value for e in CustomEnum]).pack()
window.mainloop()
正如我在评论中指出的那样,您只需要在创建 OptionMenu
小部件的行中添加一个 *
字符即可解压缩列表中的值列表。这是必需的,因为它们中的每一个都需要作为单独的参数传递。
虽然不是绝对必要,但我也建议更改自定义的定义 Enum
以使其更加简洁,并对代码进行其他一些小的更改。
结果如下:
from enum import Enum
import tkinter as tk
window = tk.Tk()
CustomEnum = Enum(value='CustomEnum',
names='Option1 Option2 Option3')
current = tk.StringVar(value=CustomEnum.Option1.name)
tk.OptionMenu(window, current, *[option.name for option in CustomEnum]).pack()
#tk.OptionMenu(window, current, *list(CustomEnum.__members__)).pack() # An alternative.
window.mainloop()
我正在尝试制作一个 window 来保存对象的所有当前数据,并允许我更改它。我坚持如何让选项菜单保存枚举值并将选择保存为正确的枚举键。
这是我当前的代码,在单击按钮时被调用:
current = tk.StringVar()
current .set(self.CustomEnum.value)
tk.OptionMenu(infoMenu, current, [e.value for e in CustomEnum]).pack()
这是列表理解的结果:
['Option 1', 'Option 2', 'Option 3']
我更专注于让它正确显示,因为现在菜单中的唯一选项是
Option1 {Option 2} {Option 3}
最小可重现示例:
import tkinter as tk
from enum import Enum
window = tk.Tk()
class CustomEnum(Enum):
Option1 = "Option1"
Option2 = "Option2"
current = tk.StringVar()
current .set(CustomEnum.Option1.value)
tk.OptionMenu(window, current, [e.value for e in CustomEnum]).pack()
window.mainloop()
正如我在评论中指出的那样,您只需要在创建 OptionMenu
小部件的行中添加一个 *
字符即可解压缩列表中的值列表。这是必需的,因为它们中的每一个都需要作为单独的参数传递。
虽然不是绝对必要,但我也建议更改自定义的定义 Enum
以使其更加简洁,并对代码进行其他一些小的更改。
结果如下:
from enum import Enum
import tkinter as tk
window = tk.Tk()
CustomEnum = Enum(value='CustomEnum',
names='Option1 Option2 Option3')
current = tk.StringVar(value=CustomEnum.Option1.name)
tk.OptionMenu(window, current, *[option.name for option in CustomEnum]).pack()
#tk.OptionMenu(window, current, *list(CustomEnum.__members__)).pack() # An alternative.
window.mainloop()