将函数绑定到kivy中的按钮

Posted

技术标签:

【中文标题】将函数绑定到kivy中的按钮【英文标题】:unbinding a function to a button in kivy 【发布时间】:2018-11-11 08:29:30 【问题描述】:

考虑以下代码:

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

所以,我google了一下,发现我应该使用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】:

函数不会解除绑定,因为你没有引用你绑定的函数。当您使用内联 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)

【讨论】:

以上是关于将函数绑定到kivy中的按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 kivy 按钮的绑定函数

在 Kivy 中使用切换按钮绑定函数

将 Kivy 列表项中的 on_release 绑定到函数

Kivy \\ 如何将按钮绑定到 boxlayout 的底部

将按钮绑定到从 Kivy 到 python 的回调

如何将函数绑定到kv文件中的按钮