使用overrideredirect时拖动窗口

问题描述 投票:0回答:1

我知道如何使用overrideredirect从Tkinter窗口中删除边框,但每当我这样做时,窗口就会变得无法响应。我无法使用alt和拖动或任何其他方法移动它。 我想创建一个看起来像那些只是一个光秃秃的窗口的“riced”应用程序的应用程序,显然如果它只是在左上角没有响应,我就不能走得太远。那么,我该怎么做?

python tkinter draggable
1个回答
8
投票

要使窗口可拖动,请在窗口上放置<Button-1>(鼠标单击)和<B1-Motion>(鼠标移动)的绑定。

您需要做的就是存储鼠标按下事件的x和y值,然后在鼠标移动事件期间,根据当前指针x和y定位窗口,将原始事件x和y加上delta。

鼠标单击绑定的处理程序存储原始事件x和y。

鼠标移动绑定的处理程序根据当前鼠标位置和最近鼠标单击存储的偏移量调用TopLevel方法geometry()重新定位窗口。您为几何方法提供几何字符串。

这是一个非常小的例子,没有考虑屏幕的边缘:

import tkinter

class Win(tkinter.Tk):

    def __init__(self,master=None):
        tkinter.Tk.__init__(self,master)
        self.overrideredirect(True)
        self._offsetx = 0
        self._offsety = 0
        self.bind('<Button-1>',self.clickwin)
        self.bind('<B1-Motion>',self.dragwin)

    def dragwin(self,event):
        x = self.winfo_pointerx() - self._offsetx
        y = self.winfo_pointery() - self._offsety
        self.geometry('+{x}+{y}'.format(x=x,y=y))

    def clickwin(self,event):
        self._offsetx = event.x
        self._offsety = event.y


win = Win()
win.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.