将函数解除绑定到kivy中的按钮

时间:2018-06-01 08:37:55

标签: button kivy unbind

请考虑以下代码:

    $capability = new ClientToken($TWILIO_ACCOUNT_SID, $TWILIO_AUTH_TOKEN);
    $capability->allowClientOutgoing($TWILIO_TWIML_APP_SID);
    $capability->allowClientIncoming($identity); //what to do in this?..
    $token = $capability->generateToken();

此代码的行为是,在我按下“按钮”之后。按钮,它打印:

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()

所以,我用Google搜索并发现我应该使用unbind()函数,并添加了这个:

Second press
First press

但输出没有变化。它仍然是相同的输出。我如何发布绑定?这只是一个最小的例子,我打算使用这个功能动态地将函数绑定和取消绑定到一个按钮,以便为同一个按钮添加各种功能。

1 个答案:

答案 0 :(得分:1)

该函数不会解除绑定,因为您没有引用绑定的函数。当您使用内联lambda时,该方法引用未保存,因此您以后不能使用它来取消绑定 这将工作:

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)