Kivy как дать всем объектам одинаковую базовую функциональность - PullRequest
0 голосов
/ 24 апреля 2019

Допустим, я создаю собственный класс Button с именем MyButton.Я хочу, чтобы все созданные кнопки MyButton воспроизводили одинаковый звук при нажатии.Но я также хочу добавить различные функции для определенных кнопок, например, я хочу, чтобы некоторые кнопки меняли текст надписи, но я также хочу, чтобы они воспроизводили этот звук.Есть ли способ сделать это с наследованием, поэтому мне не нужно помнить, что я должен добавить функциональность воспроизведения звука к каждой создаваемой кнопке?

РЕДАКТИРОВАТЬ: допустим, у меня есть класс MyButton, объявленный ниже:

class MyButton(Button):

    def generic_function_for_all_buttons(self):
        print('GENERIC FUNCTION')

теперь, когда я пытаюсь создать MyButton где-нибудь еще в коде, подобном этому:

class TestClass(BoxLayout):
    def __init__(**kwargs):
        self.buttons = []
        self.set_layout()

    def button_action(self,button):
        button.generic_function_for_all_buttons()
        print(button.text)

    def set_layout(self):
        for i in range(0,100):
            button = MyButton(text=i)
            button.on_press = functools.partial(button_action, button)
            self.buttons.append(button)
            self.add_widget(button)

Это не исполняемый код, просто демонстрация того, чего я хочу достичь,Теперь каждый раз, когда я нажимаю MyButton из TestClass, он печатает ОБЩУЮ ФУНКЦИЮ и число от 0 до 99 в зависимости от того, какая кнопка была нажата.Но мне пришлось добавить строку button.generic_function_for_all_buttons (), и я хочу избежать ее, если это возможно.Если у каждой из 100 кнопок было свое собственное действие, подобное этому:

def action_1(self,button):
    button.generic_function_for_all_buttons()
    print('1')
def action_2(self,button):
    button.generic_function_for_all_buttons()
    print('2')
def action_3(self,button):
    button.generic_function_for_all_buttons()
    print('3')
...

Эта button.generic_function_for_all_buttons () - это 100 строк кода, которых я хочу избежать.Я думал, что это должно быть как-то возможно с наследованием, например, я добавляю метод on_press в класс MyButton следующим образом:

class MyButton(Button):

    def on_press(self):
        print('GENERIC FUNCTION')

, но тогда он просто игнорирует его.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

Решение

  • Реализация on_touch_down метода в class MyButton
  • Проверка на столкновение с использованием collide_point() функции

Фрагменты

class MyButton(Button):
    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            print('GENERIC FUNCTION')
            print(f"MyButton.text={self.text}")
            return True    # consumed touch and stop propagation / bubbling
        return super(MyButton, self).on_touch_down(touch)


class TestClass(GridLayout):
    def __init__(self, **kwargs):
        super(TestClass, self).__init__(**kwargs)
        self.cols = 20
        self.buttons = []
        self.set_layout()

    def set_layout(self):
        for i in range(0,100):
            button = MyButton(text=str(i))
            self.buttons.append(button)
            self.add_widget(button)

Kivy »Основные сведения о событиях касания

По умолчанию события касания отправляются всем отображаемым в данный момент виджетам.Это означает, что виджеты получают событие касания, независимо от того, происходит ли оно в пределах их физической области.

...

Чтобы обеспечить максимальную гибкость, Kivy отправляет события всем виджетам и позволяетони решают, как реагировать на них.Если вы хотите отвечать только на сенсорные события внутри виджета, вы просто проверяете:

def on_touch_down(self, touch):
    if self.collide_point(*touch.pos):
        # The touch has occurred inside the widgets area. Do stuff!
        pass

Вывод

Result

0 голосов
/ 24 апреля 2019

Я хотел бы создать базовый класс с именем MyButton и создать дочерние классы кнопок, которые наследуются от MyButton.

Затем, используя Inheritance и Polymorphism, вы можете оставить атрибуты и методы, такие как звук, одинаковыми для всех дочерних кнопок, но иметь разные метки без необходимости иметь уникальные атрибуты для каждого дочернего элемента.

* 1004Полиморфизм также позволит вам перебирать все дочерние элементы, поскольку атрибуты имеют одинаковые имена.

См. Статью, описывающую это немного подробнее:

https://www.pythonspot.com/polymorphism/

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