首页 > 解决方案 > 移动 tkinter 窗口

问题描述

我正在尝试通过删除其标题栏来创建一个窗口。当用户使用鼠标单击并拖动时,我使窗口移动。现在,如果我在任何小部件内单击并拖动,窗口就会移动。但我想让它只有在用户点击小部件外部时才移动。任何建议都会有所帮助。这是我的代码。

from tkinter import *
    
win = Tk()
win.geometry('200x200')
win.overrideredirect(True)

offsetx = 0
offsety = 0

lst = ['Sample 1', 'Sample 2', 'Sample 3', 'Sample 4']
    
def drag(event):
    x = win.winfo_pointerx() - win.offsetx
    y = win.winfo_pointery() - win.offsety
    win.geometry('+{x}+{y}'.format(x=x,y=y))

def click(event):
    win.offsetx = event.x
    win.offsety = event.y


win.bind('<Button-1>', click)
win.bind('<B1-Motion>', drag)
            
lb1 = Listbox(win)
lb1.pack()

b1 = Button(win, text='Close', command=win.destroy).pack()

for i in range(len(lst)):
    lb1.insert(i, lst[i])

win.mainloop()

标签: pythontkinter

解决方案


似乎最简单的事情就是在拖动功能中检查哪个窗口接收到事件,并且只有在它是根窗口时才进行拖动:

def drag(event):
    if event.widget == win:
        x = win.winfo_pointerx() - win.offsetx
        y = win.winfo_pointery() - win.offsety
        win.geometry('+{x}+{y}'.format(x=x,y=y))

或者,如果您希望能够在单击中间窗口时进行拖动,您可以检查小部件的类:

def drag(event):
    window_class = event.widget.winfo_class()
    if window_class in ("Tk", "Toplevel", "Frame"):
        x = win.winfo_pointerx() - win.offsetx
        y = win.winfo_pointery() - win.offsety
        win.geometry('+{x}+{y}'.format(x=x,y=y))

推荐阅读