2014-09-07 3 views
2

Возможно ли в Tkinter избежать захвата события, которое происходит, когда вы нажимаете кнопку мыши над виджетами и удерживаете ее нажатой во время перемещения мыши?Избегайте захвата события во время движения в 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.

ответ

2

Возможно, это самый сложный способ сделать это, но все в порядке. Одна вещь, которая делает это более сложной, - это сам Tkinter, потому что event.widget по-прежнему относится к виджету, который был нажат на initally. Другое событие, которое мы можем использовать, - 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) 
+0

Jeah, я полагал, что это выход для себя, но я думал, что будет лучший способ сделать это. –

+0

Нет, я так не думаю:/ – TidB

+0

КПП. 'motion' только бросается, если нажата кнопка мыши, поэтому нет необходимости в' if tracking'; также вместо того, чтобы использовать 'list',' set' будет обрабатывать дубликаты записей сам по себе. –

 Смежные вопросы

  • Нет связанных вопросов^_^