Tkinter를 사용할 때 왜이 유형이있는 이유는 무엇입니까?
-
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 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에 대한 것이지만 이러한 기능에 변화가 있다고 상상할 수 없습니다.
감사해요!
해결책
self.canvas.coords(name)
반환 a map object
, 및 오류가 표시됩니다 map
Python 3에서는 객체가 소독 할 수 없습니다. 변경해야합니다. coords
튜플 또는 목록이기도합니다.
코드를 변경해야합니다.
temp_ids = self.canvas.find_overlapping(*tuple(self.canvas.coords(name)))
다른 팁
Python 2.x에서 Python 3.x로 몇 가지 깨진 변화가있었습니다. map
의 기능.
스크립트를 실행 했습니까? 2To3 아직?