Удалить созданный прямоугольник на холсте, щелкнув правой кнопкой мыши в tkinter python - PullRequest
0 голосов
/ 01 марта 2020

Я создаю два прямоугольника. Я хочу удалить прямоугольники с холста, щелкнув правой кнопкой мыши. Код может удалить только 1 прямоугольник, но не другой. Я использовал функцию tag_bind ("Button1"), но удаляется только нижняя. Функция Tag_bind должна иметь возможность получить идентификатор и удалить любой из выбранных прямоугольников, но этого не происходит.

    #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()

1 Ответ

0 голосов
/ 01 марта 2020

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

  1. Создайте прямоугольники. ..
        canvas.create_rectangle(75, 75, 100, 100, tags="DnD")
        canvas.create_rectangle(100, 100, 125, 125, tags="DnD")
Привязать событие "<ButtonPress-1>" к Canvas
        canvas.bind("<ButtonPress-1>", self.on_button_1)
Подготовьте popup, чтобы удалить items с tag='DELETE'
        self.popup.add_command(label="delete", 
                               command=lambda: canvas.delete(canvas.find_withtag('DELETE')))
Определение события "<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')
...