tkinterを使用しているときにこのTypeErrorが発生するのはなぜですか?
-
05-07-2019 - |
質問
だから私は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) からp>
&quot; .find_enclosed(x1、y1、x2、y2) 左上隅が(x1、y1)で右下隅が(x2、y2)の長方形内に完全に出現するすべてのオブジェクトのオブジェクトIDのリストを返します。
.find_overlapping(x1、y1、x2、y2) 前のメソッドと似ていますが、指定された長方形と少なくとも1つのポイントを共有するすべてのオブジェクトのオブジェクトIDのリストを返します。&quot;
これを修正する方法についてのアイデアはありますか?さらに情報が必要な場合はお知らせください。私が持っているtkinterバージョンは8.5で、アイドル3.1.1とpython 3.1.1があります。私が提供したpdfリンクは8.4用であることは知っていますが、これらの機能に変更があったとは想像できません。
ありがとう!
解決
self.canvas.coords(name)
mapオブジェクト
を返します。エラー状態では、 map
オブジェクトはPython 3では添え字付けできません。 coords
をタプルまたはリスト。
コードを次のように変更する必要があります:
temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))
他のヒント
Python 2.XからPython 3.Xへのいくつかの重大な変更がありました。その中には、 map
の機能があります。
2to3 を介してスクリプトを実行していますか?