微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Enum 的 Tkinter 下拉选项菜单

如何解决使用 Enum 的 Tkinter 下拉选项菜单

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

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

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,[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,*list(CustomEnum.__members__)).pack()  # An alternative.

window.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?