无法将IntEnum用作tkinter.IntVar

无法将IntEnum用作tkinter.IntVar,tkinter,Tkinter,我想使用IntEnum来填充tkIntVar(这不是一个要求,但我想这样做)。但是调用get()失败(见下文)。我相信这是一个tkinterbug,但也许我是在假设一些我不应该做的事情。主要是在这里寻找确认 IntEnum在形式上是int的一个子类,因此我希望能够用它做任何我可以用int做的事情 我正在使用python 3.6 例如: 将tkinter作为tk导入 从enum导入IntEnum 课程示例(IntEnum): 一=1 二=2 #这些到int和float的转换工作正常 打印(整数(示

我想使用
IntEnum
来填充tk
IntVar
(这不是一个要求,但我想这样做)。但是调用
get()
失败(见下文)。我相信这是一个
tkinter
bug,但也许我是在假设一些我不应该做的事情。主要是在这里寻找确认

IntEnum
在形式上是
int
的一个子类,因此我希望能够用它做任何我可以用
int
做的事情

我正在使用python 3.6

例如:

将tkinter作为tk导入
从enum导入IntEnum
课程示例(IntEnum):
一=1
二=2
#这些到int和float的转换工作正常
打印(整数(示例1))
打印(浮动(示例二))
app=tk.tk()#需要初始化某些东西或其他东西,否则IntVar构造失败
var=tk.IntVar()
#设置该值效果很好
变量集(示例1)
打印('设置成功')
打印()
#获取该值会引发异常
x=var.get()
打印(f'get result:{x}')
输出:

1
2.0
set succeeded

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 508, in get
    return self._tk.getint(value)
_tkinter.TclError: expected integer but got "Example.ONE"

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".../scratch.py", line 65, in <module>
    x = var.get()
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 510, in get
    return int(self._tk.getdouble(value))
_tkinter.TclError: expected floating-point number but got "Example.ONE"
1
2
设置成功
回溯(最近一次呼叫最后一次):
get中的第508行文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/_init__.py”
返回self.\u tk.getint(值)
_tkinter.TclError:应为整数,但得到“Example.ONE”
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“../scratch.py”,第65行,在
x=var.get()
get中的文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/_init__.py”,第510行
返回int(self._tk.getdouble(value))
_tkinter.TclError:应为浮点数,但得到“Example.ONE”

没有错误:
Enum
成员属于
Enum
类型(这是Enum的首要原因)
tk.IntVar
需要
int
类型(这就是IntVars的原因)

您可以使用
var.set(Example.ONE.value)

从枚举导入IntEnum
课程示例(IntEnum):
一=1
二=2
#这些到int和float的转换工作正常
打印(整数(示例1))
打印(浮动(示例二))
app=tk.tk()#需要初始化某些东西或其他东西,否则IntVar构造失败
var=tk.IntVar()

var.set(Example.ONE.value)#我得出结论,这是
IntEnum
中的一个bug,或者至少是一个非常不受欢迎的行为,但不是
tkinter
中的bug:它恰好被这个特定的
tkinter
用例所暴露。这个错误是
int(str(x))
失败,即使
x
int
。我不接受Reblochon Masque的回答,因为条件“
tk.IntVar
需要
int
类型”实际上是通过使用
IntEnum
正式满足的

以下是一个简化的示例:

>>> from enum import IntEnum
>>> 
>>> class Example(IntEnum):
...   ONE = 1
... 
>>> x = Example.ONE
>>> x.value
1
>>> isinstance(x, int)
True
>>> str(x)
'Example.ONE'
>>> int(str(x))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Example.ONE'
>来自enum导入IntEnum
>>> 
>>>课程示例(IntEnum):
...   一=1
... 
>>>x=示例1
>>>x.价值
1.
>>>isinstance(x,int)
真的
>>>str(x)
‘例子一’
>>>内部(str(x))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
ValueError:基数为10的int()的文本无效:“Example.ONE”

(很抱歉,下面的代码格式不起作用)感谢您指出
值。我想我在这里遇到的问题是,
IntEnum
是一个
int
(如MRO层次结构所示),因此任何可以应用于int的操作也应该适用于IntEnum。如果这不是一个bug,我需要重新检查继承“is-a”关系在Python中的真正含义…`>>类示例(IntEnum):。。。一等于一。。。二=2…>>>示例.uuuMRO_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu`
>>> from enum import IntEnum
>>> 
>>> class Example(IntEnum):
...   ONE = 1
... 
>>> x = Example.ONE
>>> x.value
1
>>> isinstance(x, int)
True
>>> str(x)
'Example.ONE'
>>> int(str(x))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'Example.ONE'