首页 > 解决方案 > tkinter 对象上的 list() 方法失败

问题描述

在将 tkinter 对象(或多个)包装在列表中时,使用方括号运算符[]list()构造函数之间似乎存在差异:

在 1:

>>> import tkinter as tk
>>> list(tk.Entry())

输出 1:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1486, in cget
    return self.tk.call(self._w, 'cget', '-' + key)
TypeError: must be str, not int

在 2:

>>> [tk.Entry()]

输出 2:

[<tkinter.Entry object .!entry2>]

考虑到type(tk.Entry())产量<class 'tkinter.Entry'>符合预期,而不是int. 提前致谢。

标签: pythonlisttkinter

解决方案


正如您在评论中被告知的那样,list(x)并且[x]不一样。

报告错误的性质更有趣。当您尝试将 an 转换Entry为列表时,list()__getitem__Entry. 无论出于何种原因,此方法都作为别名实现Entry.cget()

x = tk.Entry()
x.cget == x.__getitem__
#True

因此,list(x)调用x.__getitem__(0)以获取预期可迭代的第一个元素。反过来,这会调用x.cget(0); 这反过来又会尝试获取小部件配置选项的值'-' + 0。后一个操作无效并导致您观察到的错误消息。


推荐阅读