通过在 tkinter python 中右键单击,删除在 canvas 中创建的矩形

Delete a created rectangle in canvas by right-clicking in tkinter python

我正在创建两个矩形。我想通过右键单击从 canvas 中删除矩形。该代码只能删除 1 个矩形,而不能删除另一个。我使用了 tag_bind("Button1") 函数,但只有底部的一个被删除了。 Tag_bind 函数应该能够获取 ID 并删除任何选定的矩形,但它没有发生。

    #import sys, os, string, time
import tkinter
tk = tkinter
root =tk.Tk()
root.title ("Drag-N-Drop Demo")
# A Python example of drag and drop functionality within a single Tk widget.
# The trick is in the bindings and event handler functions.
# Tom Vrankar twv at ici.net


canvas =tk.Canvas ( width =256, height =256,
      relief =tk.RIDGE, background ="white", borderwidth =1)
class CanvasDnD (tk.Frame):



  def __init__ (self, master):
    self.master =master
    self.loc =self.dragged =0
    tk.Frame.__init__ (self, master)
    id=canvas.create_rectangle(75,75,100,100,tags="DnD")
    canvas.tag_bind(id,"<ButtonPress-1>")
    id=canvas.create_rectangle(100,100,125,125,tags="DnD")
    canvas.tag_bind(id,"<ButtonPress-1>")
    canvas.pack (expand =1, fill =tk.BOTH)
    canvas.tag_bind ("DnD", "<ButtonPress-1>", self.down)
    canvas.tag_bind ("DnD", "<ButtonRelease-1>", self.chkup)
    canvas.tag_bind ("DnD", "<Enter>", self.enter)
    canvas.tag_bind ("DnD", "<Leave>", self.leave)
    self.popup = tk.Menu(root, tearoff=0)
    self.popup.add_command(label="delete",command=lambda: self.dele(id))
    root.bind("<Button-3>", self.do_popup)

  def do_popup(self,event):
      # display the popup menu
    try:
      self.popup.tk_popup(event.x_root, event.y_root, 0)
    finally:
          # make sure to release the grab (Tk 8.0a1 only)
      self.popup.grab_release()  
  # empirical events between dropee and target, as determined from Tk 8.0
  # down.
  # leave.
  # up, leave, enter.



  def down (self, event):
    #print ("Click on %s" %event.widget.itemcget (tk.CURRENT, "text"))
    self.loc =1
    self.dragged =0
    event.widget.bind ("<Motion>", self.motion)

  def motion (self, event):
    root.config (cursor ="exchange")
    cnv = event.widget
    cnv.itemconfigure (tk.CURRENT, fill ="blue")
    x,y = cnv.canvasx(event.x), cnv.canvasy(event.y)
    a,b = cnv.canvasx(event.x + 25), cnv.canvasy(event.y+25)
    got = event.widget.coords (tk.CURRENT, x, y, a, b)

  def leave (self, event):
    self.loc =0

  def enter (self, event):
    self.loc =1
    if self.dragged ==event.time:
      self.up (event)

  def chkup (self, event):
    event.widget.unbind ("<Motion>")
    root.config (cursor ="")
    self.target =event.widget.find_withtag (tk.CURRENT)
    #event.widget.itemconfigure (tk.CURRENT, fill =self.defaultcolor)
    if self.loc: # is button released in same widget as pressed?
      self.up (event)
    else:
      self.dragged =event.time

  def up (self, event):
    event.widget.unbind ("<Motion>")
    if (self.target ==event.widget.find_withtag (tk.CURRENT)):
      print("1")
     # print ("Select %s" %event.widget.itemcget (tk.CURRENT, "text"))
    else:
      event.widget.itemconfigure (tk.CURRENT, fill ="blue")
      self.master.update()
      time.sleep (.1)
      print ("%s Drag-N-Dropped onto %s" \
        %(event.widget.itemcget (self.target, "text")),
   event.widget.itemcget (tk.CURRENT, "text"))
      event.widget.itemconfigure (tk.CURRENT, fill =self.defaultcolor)

  def dele(self,id):
    canvas.delete(id)

CanvasDnD (root).pack()
root.mainloop()

Question: first I will select that rectangle with "Button 1" and then I will right-click and delete

  1. 创建矩形...
        canvas.create_rectangle(75, 75, 100, 100, tags="DnD")
        canvas.create_rectangle(100, 100, 125, 125, tags="DnD")
  1. 将事件 "<ButtonPress-1>" 绑定到 Canvas
        canvas.bind("<ButtonPress-1>", self.on_button_1)
  1. 准备 popup,用 tag='DELETE'
  2. 删除 items
        self.popup.add_command(label="delete", 
                               command=lambda: canvas.delete(canvas.find_withtag('DELETE')))
  1. 定义事件 "<ButtonPress-1>" 回调。
    在这里,匹配项被添加 tags='DELETE' 并勾勒出 'red'.
    def on_button_1(self, event):
        iid = canvas.find_enclosed(event.x - 26, event.y - 26, event.x + 26, event.y + 26)
        canvas.itemconfigure(iid, tags='DELETE', outline='red')