Tkinter: Mouse drag a window without borders, eg. overridedirect(1) Tkinter: Mouse drag a window without borders, eg. overridedirect(1) tkinter tkinter

Tkinter: Mouse drag a window without borders, eg. overridedirect(1)


Yes, Tkinter exposes enough functionality to do this, and no, there are no easier/higher-level ways to achive what you want to do. You pretty much have the right idea.

Here's one example, though it's not the only way:

import tkinter as tkclass App(tk.Tk):    def __init__(self):        tk.Tk.__init__(self)        self.floater = FloatingWindow(self)class FloatingWindow(tk.Toplevel):    def __init__(self, *args, **kwargs):        tk.Toplevel.__init__(self, *args, **kwargs)        self.overrideredirect(True)        self.label = tk.Label(self, text="Click on the grip to move")        self.grip = tk.Label(self, bitmap="gray25")        self.grip.pack(side="left", fill="y")        self.label.pack(side="right", fill="both", expand=True)        self.grip.bind("<ButtonPress-1>", self.start_move)        self.grip.bind("<ButtonRelease-1>", self.stop_move)        self.grip.bind("<B1-Motion>", self.do_move)    def start_move(self, event):        self.x = event.x        self.y = event.y    def stop_move(self, event):        self.x = None        self.y = None    def do_move(self, event):        deltax = event.x - self.x        deltay = event.y - self.y        x = self.winfo_x() + deltax        y = self.winfo_y() + deltay        self.geometry(f"+{x}+{y}")app=App()app.mainloop()


Here is my solution:

from tkinter import *from webbrowser import *lastClickX = 0lastClickY = 0def SaveLastClickPos(event):    global lastClickX, lastClickY    lastClickX = event.x    lastClickY = event.ydef Dragging(event):    x, y = event.x - lastClickX + window.winfo_x(), event.y - lastClickY + window.winfo_y()    window.geometry("+%s+%s" % (x , y))window = Tk()window.overrideredirect(True)window.attributes('-topmost', True)window.geometry("400x400+500+300")window.bind('<Button-1>', SaveLastClickPos)window.bind('<B1-Motion>', Dragging)window.mainloop()


Try this, and it surely works;

  1. Create an event function to move window:

    def movewindow(event): root.geometry('+{0}+{1}'.format(event.x_root, event.y_root))

  2. Bind window:

    root.bind('', movewindow)

Now you can touch the the window and drag