为什么使用tkinter时会出现TypeError?

0 投票
2 回答
1222 浏览
提问于 2025-04-15 14:13

我把Python从2.6升级到了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,IDLE是3.1.1,Python也是3.1.1。我知道我提供的pdf链接是8.4的,但我想不出这些函数会有变化。

谢谢!

2 个回答

3

从Python 2.X到Python 3.X,有几个重要的变化,其中之一就是map的功能发生了变化。

你有没有用过2to3这个工具来检查你的脚本呢?

2
self.canvas.coords(name)

返回的是一个 map 对象,而且错误提示说在 Python 3 中 map 对象是不能用下标访问的。你需要把 coords 改成一个元组或者列表。

你需要把你的代码改成:

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

撰写回答