2009-09-10 7 views
0

поэтому я обновился до python 3.1.1 с 2.6, и я запустил старую мою программу, которая использует tkinter.Почему у меня есть этот TypeError при использовании 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) Returns a list of the object IDs of all objects that occur completely within the rectangle whose top left corner is (x1, y1) and bottom right corner is (x2, y2).

.find_overlapping (x1, y1, x2, y2) Like the previous method, but returns a list of the object IDs of all the objects that share at least one point with the given rectangle."

любых идей о том, как это исправить? пожалуйста, дайте мне знать, если вам нужна дополнительная информация. версия tkinter i имеет значение 8.5, у меня нет простоя 3.1.1 и python 3.1.1. Я знаю, что ссылка на pdf, предоставленная мной для 8.4, но я не могу себе представить, что в этих функциях произошли изменения.

спасибо!

+0

Я не знаю, если вы заметили, но мой ответ теперь содержит решение этого вопроса. Я бы сказал, что этот вопрос исчерпан. – SilentGhost

+0

Я заметил. Я пытаюсь заставить его работать. как вы ясно поняли, я новичок. –

ответ

2
self.canvas.coords(name) 

Вернуть map object, а также ошибочные состояния map объекта unsubscriptable в Python 3. Вам нужно изменить coords быть кортежем или список.

вам нужно изменить код, чтобы быть:

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

Я думал, self.canvas.coords(name) возвращает список a la ниже. "coords (item) => list Возврат координат для данного элемента. Если элемент относится к нескольким элементам, этот метод возвращает координаты для первого найденного элемента." –

+0

ну, понятно. – SilentGhost

+0

как можно легко увидеть в '/ tkinter/__ init __. Py' – SilentGhost

3

В Python 2.X на Python 3.X было внесено несколько изменений, среди которых map.

Вы уже запускали свой скрипт через 2to3?

+0

Нет, я этого не сделал. глядя в это сейчас. будем надеяться, что это исправит. –

+0

извините, что вам это не удалось, но в командной строке я набираю «import lib2to3», а затем «lib2to3.2to3 myfile.py», и я просто получаю «недопустимые синтаксические» ошибки, я проверил, что у меня есть lib2to3, но не могу похоже, что код примера запущен из указанной вами ссылки. есть ли что-то особенное, что я должен сделать, чтобы запустить 2to3? –

+0

@B Rivera: его нужно запустить с помощью python 2.x – SilentGhost