0

所以我从 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 文档 (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,但我无法想象这些功能发生了变化。

谢谢!

4

2 回答 2

3

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

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

于 2009-09-10T16:38:37.190 回答
2
self.canvas.coords(name)

返回 a map object,并且由于错误状态map对象在 python 3 中不可下标。您需要更改coords为元组或列表。

您需要将代码更改为:

temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))
于 2009-09-10T16:40:02.680 回答