使用overrideredirect时拖动窗口

时间:2015-04-15 04:29:33

标签: python tkinter draggable

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

2 个答案:

答案 0 :(得分:8)

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

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

鼠标单击绑定的处理程序存储原始事件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()

答案 1 :(得分:0)

此解决方案适用于我:

from tkinter import *
import mouse
global x, y

def standard_bind():
   root.bind('<B1-Motion>', lambda e: event(e, Mode=True))

def event(widget, Mode=False):
    global x, y
    if Mode:
        x = widget.x
        y = widget.y
    root.bind('<B1-Motion>', lambda e: event(e))
    root.geometry('+%d+%d' % (mouse.get_position()[0]-x, mouse.get_position()[1]-y))

root = Tk()
root.overrideredirect(True)
root.bind('<B1-Motion>', lambda e: event(e, Mode=True))
root.bind('<ButtonRelease-1>', lambda e: standard_bind())
root.geometry('%dx%d+%d+%d' % (600, 60, 50, 50))
mainloop()