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;
Create an event function to move window:
def movewindow(event): root.geometry('+{0}+{1}'.format(event.x_root, event.y_root))
Bind window:
root.bind('', movewindow)
Now you can touch the the window and drag