Привязка событий к конкретным элементам

privyazka sobytij k konkretnym elementam Экскурсия по tkinter, часть 2

Подобно тому как мы делали это для виджета Text , мы можем привязать события к одному или нескольким конкретным объектам, нарисованным в виджете Canvas, с помощью его метода tag_bind. Этот метод принимает в качестве первого аргумента строку с именем тега или идентификатор объекта. Например, можно зарегистрировать отдельные обработчики событий щелчков мыши для каждого нарисованного элемента или для группы нарисованных и помеченных тегом элементов вместо обработчика для холста в целом. В примере 9.17 для иллюстрации выполняется привязка обработчика двойного щелчка как к самому холсту, так и к двум конкретным текстовым элементам на нем. Он создает окно, изображенное на рис. 9.28.

Рис. 9.27. Окно сценария canvasDraw после нескольких вытягиваний и перемещений

 

 

Рис. 9.28. Окно сценария canvasbind

 

Пример 9.17. PP4E\Gui\Tour\canvas-bind.py

# привязка обработчиков событий к холсту и к элементам на нем

from tkinter import *

def onCanvasClick(event):

print(‘Got canvas click’, event.x, event.y, event.widget)

def onObjectClick(event):

print(‘Got object click’, event.x, event.y, event.widget, end=’ ‘)

print(event.widget.find_closest(event.x, event.y)) # найти ID текстового # объекта

root = Tk()

canv = Canvas(root, width=100, height=100)

obj1 = canv.create_text(50, 30, text=’Click me one’)

obj2 = canv.create_text(50, 70, text=’Click me two’)

canv.bind(‘<Double-1>’, onCanvasClick) # привязать к самому холсту

canv.tag_bind(obj1, ‘<Double-1>’, onObjectClick) # привязать к элементу canv.tag_bind(obj2, ‘<Double-1>’, onObjectClick) # теги тоже можно canv.pack() # использовать

root.mainloop()

Здесь методу tag_bind передаются идентификаторы объектов, но ему можно также передавать строку с именем тега, что позволяет привязывать обработчики событий к группам элементов. Когда щелчок выполняется в окне сценария за границами текстовых элементов, вызывается обработчик события холста. Когда щелчок выполняется на любом текстовом элементе, вызываются оба обработчика событий — холста и элемента. Ниже показан вывод в stdout после двух щелчков на холсте и одного щелчка на каждом из текстовых элементов. Чтобы получить идентификатор объекта для конкретного текстового элемента, ближайшего к точке щелчка, вызывается метод find_closest холста:

C:\\PP4E\Gui\Tour> python canvas-bind.py

Got canvas click 3 6 .8217952 щелчки на холсте

Got canvas click 46 52 .8217952

Got object click 51 33 .8217952 (1,) щелчок на первом текстовом элементе

Got canvas click 51 33 .8217952

Got object click 55 69 .8217952 (2,) щелчок на втором текстовом элементе

Got canvas click 55 69 .8217952

Мы еще раз вернемся к идее событий, привязываемых к холсту, в примере PyDraw, в главе 11, где они будут использоваться для реализации полнофункционального графического редактора. Мы также вернемся к сценарию canvasDraw далее в этой главе, где добавим перемещения, основанные на тегах, и простую анимацию с применением инструментов, отмеряющих время, поэтому сделайте закладку на этой странице для справок в дальнейшем. Однако сначала давайте свернем немного в сторону и исследуем другой способ компоновки виджетов в окнах — модель компоновки по сетке.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий