我在我的窗口中运行了一个动画,我想在用户拖动窗口时暂停,以确保顺畅的交互。
我尝试了以下内容:
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)
删除标题栏的情况下执行此操作,除非有一种简单的方法可以将其替换为能够捕获这些事件的类似标题栏。
答案 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()