为啥我在使用 tkinter 时会出现这个 TypeError?

Posted

技术标签:

【中文标题】为啥我在使用 tkinter 时会出现这个 TypeError?【英文标题】:Why do I have this TypeError when using tkinter?为什么我在使用 tkinter 时会出现这个 TypeError? 【发布时间】:2010-11-27 05:48:20 【问题描述】:

所以我从 2.6 升级到 python 3.1.1 并运行了我的一个使用 tkinter 的旧程序。

我收到以下错误消息,我不记得在 2.6 版本中出现过。

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python31\lib\tkinter\__init__.py", line 1399, in __call__
    return self.func(*args)
  File "C:\myprog.py", line 77, in <lambda>
    self.canvas.bind("<Button-3>", lambda event: myfunc_sub(event))
  File "C:\myprog.py", line 65, in myfunc_sub
    temp_ids = self.canvas.find_overlapping(self.canvas.coords(name)[0], self.canvas.coords(name)[1], self.canvas.coords(name)[2],self.canvas.coords(name)[3])
TypeError: 'map' object is not subscriptable

我很确定这条线

temp_ids = self.canvas.find_overlapping(self.canvas.coords(name)[0], self.canvas.coords(name)[1], self.canvas.coords(name)[2],self.canvas.coords(name)[3])

在旧版本中没问题。我不确定发生了什么变化,因此我获取每个坐标的方式是不可能的。

来自tkinter docs (pdf)

".find_enclosed (x1, y1, x2, y2) 返回完全出现在左上角为 (x1, y1) 且右下角为 (x2, y2) 的矩形内的所有对象的对象 ID 列表。

.find_overlapping ( x1, y1, x2, y2 ) 与上一个方法类似,但返回与给定矩形共享至少一个点的所有对象的对象 ID 列表。"

关于如何解决这个问题的任何想法?如果您需要更多信息,请告诉我。我拥有的 tkinter 版本是 8.5,我有空闲的 3.1.1 和 python 3.1.1。我知道我提供的 pdf 链接适用于 8.4,但我无法想象这些功能发生了变化。

谢谢!

【问题讨论】:

我不知道你是否注意到了,但我的回答现在包含了这个问题的解决方案。我会说这个问题已经用尽了。 我注意到了。我正试图让它工作。如您所知,我是初学者。 【参考方案1】:

从 Python 2.X 到 Python 3.X 有几个重大变化——其中包括map 的功能。

您已经通过2to3 运行您的脚本了吗?

【讨论】:

很抱歉给您带来了麻烦,但在命令行我输入“import lib2to3”然后输入“lib2to3.2to3 myfile.py”,我只是得到“无效语法”错误,我检查了我有 lib2to3,但似乎无法从您发送的链接中运行示例代码。为了让 2to3 运行,我需要做些什么特别的事情吗? @B Rivera: 它需要使用 python 2.x 运行 @SilentGhost:嘘。好吧,这太糟糕了,我使用的这台机器只有 python 3.x。并且代码刚刚被复制过来。我的另一台笔记本电脑在大西洋的另一边。除了下载 python 2.x 或遍历每一行代码,我还能做什么? 取决于我想的代码的大小和复杂性。 2to3 不会为你解决这个问题。 @Mark:我认为这是python版本之间的错误/不一致,这可能无法用2to3解决【参考方案2】:
self.canvas.coords(name)

返回一个map object,并且由于错误状态map 对象在python 3 中是不可订阅的。您需要将coords 更改为元组或列表。

您需要将代码更改为:

temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))

【讨论】:

我认为 self.canvas.coords(name) 返回下面的列表。 "coords(item) => list 返回给定项目的坐标。如果项目引用多个项目,则此方法返回找到的第一个项目的坐标。" /tkinter/__init__.py中很容易看到 好的,谢谢。让我问你这个,这是什么意思:convertcoords = *tuple(self.canvas.coords(name)) SyntaxError: can use starred expression only as assignment target 因为你没有分配任何东西,如果你想 convertecoords 成为一个元组,只需删除星号。 感谢您的快速帮助、耐心和编辑,silentghost。我将 convertcoords = tuple(self.canvas.coords(name)) 行添加到适当的位置,现在一切正常。

以上是关于为啥我在使用 tkinter 时会出现这个 TypeError?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 .bashrc 中使用 `uname` 时会出现错误?

Django:为啥当我在 django 中通过 popen 使用 Ghostscript 时会出现“找不到文件”错误

为啥我在构建 Flutter Web 时会出现白屏

为啥我在安装SQL Sever Management Studio2012在功能选择时会出现此页验证有错误?

为啥我在 Kotlin 中键入视图名称/ID 时会出现“未解析的引用”错误?

为啥我在 IA32_LSTAR MSR 上使用内核调试器在 64 位 Windows 上为 SYSCALL 设置断点时会出现 DoubleFault? (KVASCODE 部分)