Удаление строк на холсте Python tkinter

Я пытаюсь, чтобы пользователь удалял строки при нажатии правой кнопки мыши. Я привязал событие нажатия кнопки 3 к холсту и передал его следующей функции

def eraseItem(self,event):
    objectToBeDeleted = self.workspace.find_closest(event.x, event.y, halo = 5)
if objectToBeDeleted in self.dictID:
    del self.dictID[objectToBeDeleted]
    self.workspace.delete(objectToBeDeleted)

Однако ничего не происходит, когда я щелкаю правой кнопкой мыши по линиям. Я протестировал словарь отдельно, и объекты строки сохраняются правильно.

Вот моя привязка:

self.workspace.bind("<Button-3>", self.eraseItem)

По запросу некоторые другие фрагменты из инициализации словаря

def __init__(self, parent):
    self.dictID = {}
... Some irrelevant code omitted

Для создания линии у меня есть два обработчика: при нажатии и при выпуске, которые рисуют линии между обеими координатами.

def onLineClick(self, event):
  self.coords = (event.x, event.y)

def onLineRelease(self, event):
  currentLine = self.workspace.create_line(self.coords[0], self.coords[1], event.x, event.y, width = 2,     capstyle = ROUND)
  self.dictID[currentLine] = self.workspace.coords(currentLine)
  print(self.dictID.keys()) #For testing dictionary population
  print(self.dictID.values()) #For testing dictionary population

Словарь печатает здесь нормально. Обратите внимание, что это все функции в одном классе.


person user2148990    schedule 15.03.2013    source источник
comment
Ваш код (по крайней мере, эта функция) выглядит нормально. Правильно ли привязан обработчик событий? Попробуйте распечатать objectToBeDeleted.   -  person A. Rodas    schedule 15.03.2013
comment
И да, он правильно печатает соответствующий Canvas ID, когда я печатаю после присвоения переменной   -  person user2148990    schedule 15.03.2013
comment
Тогда я могу только предложить вам удалить элемент холста перед условным. Но определенно эта функция не имеет никаких проблем.   -  person A. Rodas    schedule 15.03.2013
comment
Вывод workspace.delete за пределы условной работы по удалению строки, но теперь словарь не обновляется. Я добавил оператор печати, чтобы увидеть, напечатано ли условие true и false, даже если строка была удалена, по какой причине это может быть?   -  person user2148990    schedule 15.03.2013


Ответы (1)


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

def eraseItem(self,event):
    tuple_objects = self.workspace.find_closest(event.x, event.y, halo = 5)
    if len(tuple_objects) > 0 and tuple_objects[0] in self.dictID:
        objectToBeDeleted = tuple_objects[0]
        del self.dictID[objectToBeDeleted]
        self.workspace.delete(objectToBeDeleted)
person A. Rodas    schedule 16.03.2013