【问题标题】:Deleting lines on a Python tkinter canvas在 Python tkinter 画布上删除行
【发布时间】:2013-03-15 15:33:12
【问题描述】:

我试图让用户在单击鼠标右键时删除行。我已将按钮 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)

根据字典初始化请求其他一些 sn-ps

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

对于线的创建,我有两个处理程序,一个 on click 和一个 on release,它在两个坐标之间绘制线

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

字典在这里打印得很好。 请注意,这些都是一个类中的所有函数。

【问题讨论】:

  • 你的代码(至少这个函数)看起来不错。事件处理程序是否正确绑定?尝试打印objectToBeDeleted
  • 是的,当我在变量赋值后打印时,它会正确打印适当的 Canvas ID
  • 那我只能建议你删除条件之前的canvas的item。不过这个功能肯定没问题。
  • 将workspace.delete 放在删除行的条件工作之外,但现在字典没有更新。我添加了一个打印语句,以查看条件是否打印为 true,即使该行已被删除,它是否打印为 false,这可能是什么原因?

标签: python tkinter tkinter-canvas


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    相关资源
    最近更新 更多