Tkinter: перетаскивание мышью окна без границ, например. overridedirect (1) - PullRequest
3 голосов
/ 29 октября 2010

Любые предложения о том, как можно создать привязки событий, которые позволили бы пользователю перетаскивать мышью окно без границ, например.окно, созданное с помощью overridedirect(1)?

Вариант использования: мы хотели бы создать плавающее окно панели инструментов / палитры (без границ), которое наши пользователи могут перетаскивать на своем рабочем столе.

Вот гдеЯ в своих мыслях (псевдокод):

  1. window.bind( '<Button-1>', onMouseDown ) для захвата начальной позиции мыши.

  2. window.bind( '<Motion-1>', onMouseMove ) для отслеживания положения мыши, когда она начинает двигаться.

  3. Вычислить, сколько мышь переместилась и вычислить newX, newY позиций.

  4. Используйте window.geometry( '+%d+%d' % ( newX, newY ) ) для перемещения окна.

Предоставляет ли Tkinter достаточную функциональность, чтобы позволить мне выполнить поставленную задачу?Или есть более простые / высокоуровневые способы достижения того, что я хочу сделать?

Ответы [ 3 ]

10 голосов
/ 30 октября 2010

Да, Tkinter предоставляет достаточно функциональности, чтобы сделать это, и нет, нет более простых / высокоуровневых способов достичь того, что вы хотите сделать. Вы в значительной степени имеете правильную идею.

вот пример:

import Tkinter as tk
import tkFileDialog 

class 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.StartMove)
        self.grip.bind("<ButtonRelease-1>", self.StopMove)
        self.grip.bind("<B1-Motion>", self.OnMotion)

    def StartMove(self, event):
        self.x = event.x
        self.y = event.y

    def StopMove(self, event):
        self.x = None
        self.y = None

    def OnMotion(self, event):
        deltax = event.x - self.x
        deltay = event.y - self.y
        x = self.winfo_x() + deltax
        y = self.winfo_y() + deltay
        self.geometry("+%s+%s" % (x, y))



app=App()
app.mainloop()
1 голос
/ 02 января 2017

Попробуйте, и это, безусловно, сработает;

  1. Создайте функцию события для перемещения окна:

    def movewindow (событие): root.geometry ('+ {0} + {1} '. Format (event.x_root, event.y_root))

  2. Окно привязки:

    root.bind (' ', movewindow)

Теперь вы можете коснуться окна и перетащить

0 голосов
/ 03 июня 2019

Этот код такой же, как и у решения Брайана, но он не использует переопределенную прямую.

Было протестировано с: python 3.7, Debian GNU / Linux 10 (buster), Gnome 3.30

import tkinter as tk


class 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.resizable(0, 0)  # Window not resizable
        self.wm_attributes('-type', 'splash')  # Hide title bar (Linux)

        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.StartMove)
        self.grip.bind("<ButtonRelease-1>", self.StopMove)
        self.grip.bind("<B1-Motion>", self.OnMotion)

    def StartMove(self, event):
        self.x = event.x
        self.y = event.y

    def StopMove(self, event):
        self.x = None
        self.y = None

    def OnMotion(self, event):
        deltax = event.x - self.x
        deltay = event.y - self.y
        x = self.winfo_x() + deltax
        y = self.winfo_y() + deltay
        self.geometry("+%s+%s" % (x, y))


app = App()
app.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...