Используйте метод self.collide_points()
для проверки столкновения касания с интересующим виджетом.
Фрагменты
класс CreateLabel (Label):
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
# TODO
# call method mark_label()
if touch.button == "right":
print("Right mouse clicked on {}".format(self.text))
elif touch.button == "left":
print("Left mouse clicked on {}".format(self.text))
else:
print(self.id)
return True
return super(CreateLabel, self).on_touch_down(touch)
Руководство по программированию »События и свойства» Отправка события Property
Если касание попадает внутрь нашего виджета, мы меняем значение нажатой на touch.pos и возвращаем True, указывая, чтомы поглотили прикосновение и не хотим, чтобы оно распространялось дальше.
...
Наконец, если касание выходит за пределы нашего виджета, мы вызываем исходное событие, используя super (…), и возвращаем результат.Это позволяет продолжить распространение события касания, как обычно.
Пример
main.py
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
class CreateLabel(Label):
def on_touch_down(self, touch):
if self.collide_point(*touch.pos):
if touch.button == "right":
print("Right mouse clicked on {}".format(self.text))
elif touch.button == "left":
print("Left mouse clicked on {}".format(self.text))
else:
print(self.id)
return True
return super(CreateLabel, self).on_touch_down(touch)
class RootWidget(GridLayout):
def __init__(self, **kwargs):
super(RootWidget, self).__init__(**kwargs)
self.build_board()
def build_board(self):
# make 9 label in a grid
for i in range(0, 9):
label = CreateLabel(id=str(i), text="Label {}".format(i))
self.add_widget(label)
class TestApp(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
TestApp().run()
test.kv
#:kivy 1.10.0
<CreateLabel>:
canvas.before:
Color:
rgba: 0, 1, 1, 0.5 # 50% blue
Rectangle:
size: self.size
pos: self.pos
font_size: 30
on_touch_down: self.on_touch_down
<RootWidget>:
rows: 3
cols: 3
row_force_default: True
row_default_height: 150
col_force_default: True
col_default_width: 150
padding: [10]
spacing: [10]
Выход