是否可以在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_current
和grab_status
方法,但他们总是返回None
。
Python版本是3.4.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)