Advertisement
here2share

# Tk_DragAndDropDemo.py

Nov 1st, 2019
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.47 KB | None | 0 0
  1. # Tk_DragAndDropDemo.py
  2.  
  3. from Tkinter import *
  4.  
  5. #--------------------------------------------
  6. class DragableRect:
  7.     def __init__(self, options):
  8.         """
  9.         each DragableRect instance is initialised with a dict :
  10.         d = DragableRect({"parent": canvas, "x": 10, "y": 10, ... })
  11.         dict keys are classic options of
  12.         Canvas's create_rectangle method :
  13.         x, y, width, height, outline, fill, tags
  14.         "parent" is for the container canvas
  15.         "axis" : "both" to drag in evry
  16.         """
  17.         self.parent = options["parent"] # canvas
  18.         self.x = options["x"]
  19.         self.y = options["y"]
  20.         self.width = options["width"]
  21.         self.height = options["height"]
  22.         self.outline = options["outline"]
  23.         self.fill = options["fill"]
  24.         self.tag = options["tag"]
  25.         self.axis = options["axis"] # 'h', 'v' or 'both'
  26.  
  27.         self.selected = False
  28.  
  29.     def display(self):
  30.         """
  31.         draw rect on parent Canvas
  32.         """
  33.         self.parent.create_rectangle(
  34.                 self.x,
  35.                 self.y,
  36.                 self.x + self.width,
  37.                 self.y + self.height,
  38.                 fill = self.fill,
  39.                 outline = self.outline,
  40.                 tags = self.tag)
  41.  
  42.     def getPos(self):
  43.         """
  44.         return self coords as (x0, y0, x1, y1)
  45.         """
  46.         return self.parent.coords(self.tag)
  47.  
  48. class DragableCircle:
  49.     pass
  50.  
  51. #-----------------------------------------------------------------
  52. class DragAndDrop(Tk):
  53.     """
  54.     Tkinter app based on Tk()
  55.     """
  56.     def __init__(self):
  57.         Tk.__init__(self)
  58.         self.title("Tkinter Drag And Drop")
  59.         self.geometry("400x300+40+40")
  60.         self.can = Canvas(self, width=400, height=300, bg="#000233")
  61.         self.can.pack()
  62.  
  63.         #these attributes are used in click, drag and drop methods
  64.         self.click_flag = False
  65.         self.offset_x = 0
  66.         self.offset_y = 0
  67.  
  68.         self.items = [
  69.             DragableRect({
  70.                 "parent": self.can,
  71.                 "x": 100,
  72.                 "y": 100,
  73.                 "width": 50,
  74.                 "height": 50,
  75.                 "outline": "red",
  76.                 "fill": "red",
  77.                 "tag": "red",
  78.                 "axis": "both"
  79.                 }),
  80.             DragableRect({
  81.                 "parent": self.can,
  82.                 "x": 250,
  83.                 "y": 50,
  84.                 "width": 40,
  85.                 "height": 60,
  86.                 "outline": "#46b96a",
  87.                 "fill": "#46b96a",
  88.                 "tag": "green",
  89.                 "axis": "h"
  90.                 })]
  91.  
  92.         for i in self.items:
  93.             i.display()
  94.  
  95.         self.bind("<Button-1>", self.click)
  96.         self.bind("<ButtonRelease-1>", self.drop)
  97.         self.bind("<B1-Motion>", self.drag)
  98.  
  99.     def click(self, evt):
  100.         """
  101.         if a rect is clicked :
  102.         - switch 'click_flag' to True
  103.         - switch rect's 'selected' attribute to True
  104.         - detect mouse offset from top-left corner of clicked rect
  105.         """
  106.         x, y = evt.x, evt.y
  107.         for i in self.items:
  108.             coords = i.getPos()
  109.             if x > coords[0] and x < coords[2]:
  110.                 if y > coords[1] and y < coords[3]:
  111.                     self.click_flag = True
  112.                     i.selected = True
  113.                     self.offset_x = x - i.x
  114.                     self.offset_y = y - i.y
  115.                     break
  116.  
  117.     def drop(self, evt):
  118.         """
  119.         - switch 'click_flag' and dragged rect's 'selected' attribute to False
  120.         - update rect's 'x' and 'y' attributes
  121.         """
  122.         if self.click_flag:
  123.             x, y = evt.x, evt.y
  124.             self.click_flag = False
  125.             for i in self.items:
  126.                 if i.selected:
  127.                     i.x = x - self.offset_x
  128.                     i.y = y - self.offset_y
  129.                     i.selected = False
  130.  
  131.     def drag(self, evt):
  132.         if self.click_flag:
  133.             x, y = evt.x, evt.y
  134.             for i in self.items:
  135.                 if i.selected:
  136.                     self.can.coords(i.tag,
  137.                                     x - self.offset_x,
  138.                                     y - self.offset_y,
  139.                                     (x - self.offset_x) + i.width,
  140.                                     (y - self.offset_y) + i.height)
  141.  
  142. #-------------------------------------------------------------------
  143. if __name__ == '__main__':
  144.  
  145.     app = DragAndDrop()
  146.     app.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement