Отмена привязки функции к кнопке в киве - PullRequest
0 голосов
/ 01 июня 2018

Рассмотрим следующий код:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button


class First(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        x = Button(text='somebutton')
        x.bind(on_press=lambda*_: print('First press'))
        x.bind(on_press=lambda*_: print('Second press'))

        self.add_widget(x)

    def something(self, *somethingishereignored):
        print("I have something")

class FChooser(App):
    def build(self):
        return First()

if __name__ == '__main__':
    FChooser().run()

Поведение этого кода заключается в том, что после нажатия кнопки somebutton он печатает:

Second press
First press

Итак, я погуглили обнаружил, что я должен использовать функцию unbind (), и я добавил это:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button


class First(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        x = Button(text='somebutton')
        x.bind(on_press=lambda*_: print('First press'))
        x.unbind(on_press=lambda*_: print('First press'))
        x.bind(on_press=lambda*_: print('Second press'))

        self.add_widget(x)

    def something(self, *somethingishereignored):
        print("I have something")

class FChooser(App):
    def build(self):
        return First()

if __name__ == '__main__':
    FChooser().run()

, но вывод не меняется.Это все тот же вывод.Как мне снять привязку?Это лишь минимальный пример, и я намерен использовать эту функцию для динамического связывания и открепления функции с кнопкой, чтобы добавить различные функции к одной и той же кнопке.

1 Ответ

0 голосов
/ 01 июня 2018

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

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button


class First(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        x = Button(text='somebutton')
        x.bind(on_press=self.press1)
        x.unbind(on_press=self.press1)
        x.bind(on_press=self.press2)

        self.add_widget(x)

    def press1(self, *args):
        print("First press")

    def press2(self, *args):
        print("Second press")


class FChooser(App):
    def build(self):
        return First()

if __name__ == '__main__':
    FChooser().run()

Или это:

    press1 = lambda*_: print('First press')
    press2 = lambda*_: print('Second press')
    x = Button(text='somebutton')
    x.bind(on_press=press1)
    x.unbind(on_press=press1)
    x.bind(on_press=press2)
...