4

マウスの右ボタンがクリックされたときにユーザーに行を削除させようとしています。ボタン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

線の作成には、2 つのハンドラーがあります。クリック時とリリース時で、両方の座標間に線を描画します。

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

辞書はここでうまく印刷されます。これらはすべて 1 つのクラス内の関数であることに注意してください。

4

1 に答える 1

0

私はあなたのコードに基づいて実際の例を作成しようとしましたが、問題がどこにあるかfind_closestがわかりました.アイテムが見つかった場合、1つの要素を持つタプルを返すため、辞書にあるかどうかを確認するときは、最初に取得する必要がありますタプルの最初の要素。

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)
于 2013-03-16T19:11:19.047 に答える