使用overrideredirect时拖动窗口

yyy*_*Hyy 0 python tkinter draggable

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

dus*_*sty 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()
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,我的窗口仍然在跳跃 - 只有当我单击最右下边缘时它才不会。 (2认同)