Tkinter使用Enum的下拉选项菜单



我试图做一个窗口,将持有所有的当前数据的对象,并将让我改变它。我卡住了如何使选项菜单保持枚举的值,并将选择保存为正确的枚举键。

这是我当前的代码,在按钮点击时被调用:

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()

最新更新