【问题标题】:Tkinter Dropdown options menu using Enum使用枚举的 Tkinter 下拉选项菜单
【发布时间】:2021-02-14 12:05:35
【问题描述】:

我正在尝试创建一个窗口来保存对象的所有当前数据,并让我更改它。我被困在如何使选项菜单保存枚举的值并将选择保存为正确的枚举键。

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

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

【问题讨论】:

  • 如果您想正确显示它们,请添加*。即tk.OptionMenu(window, current, *[e.value for e in CustomEnum]).pack()
  • 不客气。这里有一点documentation 供以后参考。

标签: python tkinter drop-down-menu enums list-comprehension


【解决方案1】:

正如我已经在评论中指出的那样,您只需在创建 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()

【讨论】:

    猜你喜欢
    • 2019-05-10
    • 2019-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多