2013-03-15 4 views
4

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

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 

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

+0

Ваш код (по крайней мере эта функция) выглядит хорошо. Правильно ли связан обработчик события? Попробуйте напечатать 'objectToBeDeleted'. –

+0

И да, он правильно печатает соответствующий идентификатор Canvas при печати после назначения переменной – user2148990

+0

Тогда я могу только предложить вам удалить элемент холста перед условным. Но определенно эта функция не имеет никаких проблем. –

ответ

0

Я попытался создать рабочий пример на основе вашего кода, и теперь я знаю, где проблема: 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) 
Смежные вопросы