在Tkinter运动期间避免事件抓取

时间:2014-09-07 16:37:16

标签: python events tkinter python-3.4

是否可以在Tkinter中避免在按下鼠标按钮时发生的事件抓取并在移动鼠标时按住它?

我想注册鼠标按钮,然后跟踪用户在按下按钮的同时移动鼠标时输入的所有小部件。当用户释放鼠标按钮时,应用程序会对所有跟踪的小部件执行相同的操作。

以下代码应该解释我想要做什么。

# Set a tracking flag
widget.bind('<Button>', start_tracking)
# Add the entered widget to the tracked widgets, if the tracking flag is set
widget.bind('<Enter>', add_to_tracked_widgets)
# Execute an action for every tracked widget; unset the flag
widget.bind('<ButtonRelease>', end_tracking)

我查看了grab_currentgrab_status方法,但他们总是返回None

Python版本是3.4.1。

1 个答案:

答案 0 :(得分:2)

这可能是执行此操作最复杂的方法,但没关系。 使这更复杂的一件事是Tkinter本身,因为event.widget仍然指的是最初点击的小部件。我们可以使用的另一个事件是Motion,当鼠标在窗口小部件内移动时会激活它。

tk.bind("<Motion>", add_tracked)

我认为你可以自己实现列表和状态变量,所以我们来add_tracked方法(我刚刚重命名它,它是你的add_to_tracked_widgets):

def add_tracked(event):
    if tracking:
        # Get coordinated of the event and use the master window method to determine
        # wich widget lays inside these.
        widget = tk.winfo_containing(event.x_root, event.y_root)
        # Since 'Motion' creates many events repeatedly, you have to convert this
        # list into a set to remove duplicates.
        widgets.append(widget)