Tkinter:检测窗口拖动事件

时间:2017-07-19 07:37:12

标签: python tkinter

我在我的窗口中运行了一个动画,我想在用户拖动窗口时暂停,以确保顺畅的交互。

我尝试了以下内容:

root.bind("<ButtonPress-1>", lambda e: start_stop_animation(False))
root.bind("<B1-Motion>", lambda e: start_stop_animation(False))
root.bind("<ButtonRelease-1>", lambda e: start_stop_animation(self._is_running))

似乎这些调用根本没有绑定到标题栏。

我想在不使用root.overrideredirect(True)删除标题栏的情况下执行此操作,除非有一种简单的方法可以将其替换为能够捕获这些事件的类似标题栏。

1 个答案:

答案 0 :(得分:4)

<Configure>事件捕获窗口拖动,这也是由窗口大小调整触发的。

要在拖动开始时,拖动期间和结束时执行不同的操作,您可以使用after方法:

每次发生<Configure>事件时,您都会在给定延迟的情况下安排对stop_drag函数的调用,但每次在结束前发生另一个<Configure>事件时,您都会取消此调用延迟。

import tkinter as tk

root = tk.Tk()

drag_id = ''


def dragging(event):
    global drag_id
    if event.widget is root:  # do nothing if the event is triggered by one of root's children
        if drag_id == '':
            # action on drag start
            print('start drag')
        else:
            # cancel scheduled call to stop_drag
            root.after_cancel(drag_id)
            print('dragging')
        # schedule stop_drag
        drag_id = root.after(100, stop_drag)


def stop_drag():
    global drag_id
    print('stop drag')
    # reset drag_id to be able to detect the start of next dragging
    drag_id = '' 


root.bind('<Configure>', dragging)
root.mainloop()