Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import tkinter as tk
- icomove = '''
- iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABMlBMVEX///8AAAAAAAAAAAAAAAAAAAA
- AAAAAAAAAAABDRUUAAABNUU9fYmJjZmVaXlxnbGpqbmu4vL3b3d7Cw8PP0NCNkI2OkJCSlpSZm5uZnJ
- qgoaGlpqapqamqq6urq6utra2urq6vr6+wsLCysrK2tra5ubm6vr+7u7vBwcHCwsLDxMPIyMjLy8vNz
- c3Ozs7P0NDW1tbY2Njb29vb3d7c3Nvh4eHi4uLj4+Pk5OTl5eXn6Ojo6enp6enp6urp6uvq6+vr6+vr
- 7Ozs7Ozs7e3t7e3t7u7u7u7u7+/u8PHv7+/v8PDw8PDw8fHx8fHx8fLx8vLy8vLy8/Pz8/Pz9PT09PT
- 09fX19fX19vb29vb29/f39/f3+Pj4+Pj5+fj5+fn6+vn6+vr6+/v7+/v8/Pz9/f3+/v4I2c3KAAAAFX
- RSTlMAAQIDJTtFS0x4gZKYpq62xPf6/v7RkfSJAAABnUlEQVR42o2Tg4IjQRBA17vJ2Q7PVmxb45moB
- /n/X7iurvGcahG8l64XHf17zi6vonN55gmX2nS+4nhBFCVJVlRVgzEufcK0XKm32p3eYDSeTGezBcza
- J1wtao0Ww9PZYrlacRzHc5srn8AxDhg2CaJEZxf3Uq74Vrc/mkwpplBWFNqhkqSXciV04eFLwApN3MA
- Yz72UK4nyxYoXJAXobrcjhJgvnBQQGBdlVaOU4JgJTGGCAlxSHGzAWElMYYI2s7lDDZMKmILCkheRA8
- Ox0pjChDUnyD5uwRzSFDvCRpBU5IhRwBQU6AKbA8LJsBQUdhIs8HG4yGIKCs4BDFsGkQRJz+ImW8ADm
- GDuRtVivvDjlV/QNu4Bptb8+vHD5y9PDVaCAmEb8ADSfnuwSOmxaadcMmGNG+CAZf6ltS8+Mp0UFCAB
- Nxjt79lt7oHlpNy9CAmk+u3Nz4eWk3L/+ikVLgPCp/dPTDflxskRCKb3EhnD18+8lFsn/i9OPJ1KpzO
- Zd17K7eMj30RTbvp5NOXeNT+PptyJ/eM7fH703/MLSVTu/2Cp7PcAAAAASUVORK5CYII=
- '''
- class DragWin(tk.Toplevel):
- def __init__(self, parent: callable, *args, **kwargs):
- super().__init__(parent, *args, **kwargs)
- self.overrideredirect(True)
- self.lift()
- self.wm_attributes('-topmost', True)
- self.ico = tk.PhotoImage(data=icomove)
- lbl = tk.Label(self, image=self.ico, bg='white')
- lbl.grid(row=0, column=0)
- class DragDropElement:
- def __init__(self, obj: callable, tipe: str='text', *args, **kwargs):
- self.obj = obj
- self._dragable = True
- self._dropable = True
- self.obj.dropable = True
- self.tipe = tipe
- self.obj.tipe = self.tipe
- self.obj.drop_data = self.drop_data
- self.mwin = None
- self.obj.bind("<Button-3>", self._on_press)
- self.obj.bind("<B3-Motion>", self._on_motion)
- self.obj.bind("<ButtonRelease-3>", self._on_release)
- @property
- def dragable(self) -> bool:
- return self._dragable
- @dragable.setter
- def dragable(self, value: bool) -> None:
- self._dragable = value
- @property
- def dropable(self) -> bool:
- return self._dropable
- @dropable.setter
- def dropable(self, value: bool) -> None:
- self._dropable = value
- def _on_press(self, evt: callable) -> None:
- if not self._dragable: return
- x,y = self.obj.winfo_pointerxy()
- self.mwin = DragWin(self.obj)
- self.mwin.geometry(f'+{x}+{y}')
- def _on_motion(self, evt: callable) -> None:
- if not self._dragable: return
- x, y = self.obj.winfo_pointerxy()
- self.mwin.geometry(f'+{x}+{y}')
- def _on_release(self, evt: callable) -> None:
- if not self._dragable: return
- self.mwin.destroy()
- self.mwin = None
- x, y = self.obj.winfo_pointerxy()
- obj = self.__verify_to_coords((x,y))
- if obj and hasattr(obj, 'dropable'):
- txt = self.obj.get()
- obj.drop_data(self.tipe, txt)
- def __verify_to_coords(self, c2: tuple) -> callable:
- top = self.__get_top(self.obj)
- if not top: return
- w = top.winfo_containing(*c2)
- return top._nametowidget(w)
- def __get_top(self, wdg: callable) -> callable:
- p = wdg.winfo_parent()
- w = wdg._nametowidget(p)
- if w:
- if isinstance(w, tk.Tk):
- top = w
- else:
- top = self.__get_top(w)
- else:
- top = None
- return top
- def drop_data(self, descriptor, data: any) -> None:
- if not self._dropable: return
- if descriptor != self.obj.tipe: return
- if self.tipe == 'text':
- if self.obj.get():
- data = ' ' + data
- self.obj.insert(tk.END, data)
- class WinDest(tk.Toplevel):
- def __init__(self, parent, *args, **kwargs):
- super().__init__(parent, *args, **kwargs)
- self.parent = parent
- lbl = tk.Label(self, text='Casella destinazione :')
- lbl.grid(row=0, column=0, padx=5, pady=5, sticky='w')
- en = tk.Entry(self)
- en.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
- self.e_test = DragDropElement(en)
- self.e_test.dragable = False # commentare x attivare
- def message(self, msg):
- self.dida.configure(text=msg)
- self.update()
- class WinTest(tk.Tk):
- def __init__(self):
- super().__init__()
- lbl = tk.Label(self, text='Casella sorgente :')
- lbl.grid(row=0, column=0, padx=5, pady=5, sticky='w')
- en = tk.Entry(self)
- en.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
- self.e_test = DragDropElement(en)
- self.e_test.dragable = False
- pn_bt = tk.Frame(self)
- pn_bt.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky='ew')
- self.bt_active = tk.Button(pn_bt, text='Attiva', command=self._on_active)
- self.bt_active.grid(row=0, column=0, padx=(5,2), pady=5, sticky='ew')
- bt_close = tk.Button(pn_bt, text='Chiudi', command=self.destroy)
- bt_close.grid(row=0, column=1, padx=(2,5), pady=5, sticky='ew')
- pn_bt.grid_columnconfigure(0, weight=1, uniform='bt')
- pn_bt.grid_columnconfigure(1, weight=1, uniform='bt')
- self.grid_rowconfigure(0, weight=1)
- self.grid_columnconfigure(0, weight=1)
- def _on_active(self):
- self.e_test.dragable = not self.e_test.dragable
- if self.e_test.dragable:
- self.bt_active.configure(text='Disattiva')
- else:
- self.bt_active.configure(text='Attiva')
- def message(self, msg):
- self.dida.configure(text=msg)
- self.update()
- if __name__ == '__main__':
- app = WinTest()
- w = WinDest(app)
- app.mainloop()
- # Questo OK
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement