Как я могу определить, когда касание находится в виджете детей в kivy - PullRequest
0 голосов
/ 29 мая 2018

Как я могу определить, когда позиция касания в детском виджете игровой сетки?когда я хочу вызвать детей метод mark_label ().Спасибо.

class GameGrid(GridLayout):

    def on_touch_move(self, touch):
        #wich label is collision  
        print(str(touch.pos))


class StartScreen(Screen):

    level = Level(mode, 1)

    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.create_level()

    def create_level(self):
        self.ids.game_grid.clear_widgets()

        labels = self.level.get_letters_label()
        for f in range(len(labels)):
            self.ids.game_grid.add_widget(labels[f])

1 Ответ

0 голосов
/ 29 мая 2018

Используйте метод 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]

Выход

Img01 - Clicked on Label 3 Img02 - Clicked on Label 8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...