为什么使用tkinter时会出现TypeError?
我把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])
在旧版本里是没问题的。我不太明白是什么改变了,以至于我获取每个坐标的方式不再可行。
".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)))