首页 > 解决方案 > kivy.uix.behaviors.TouchRippleButtonBehavior 的 on_release 不起作用

问题描述

我有一个继承自 kivy.uix.behaviors.TouchRippleButtonBehavior的 boxlayout ,并且涟漪效果很好,但是,当我定义一个 'on_press' 或 'on_release' 时,函数永远不会运行。kivy.uix.behaviors.ButtonBehavior 也是如此,这是为什么呢?我的代码片段:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.behaviors import TouchRippleButtonBehavior
from kivy.graphics import Color, Rectangle


class RippleBox(TouchRippleButtonBehavior, BoxLayout):
    def __init__(self, **kwargs):
        super(RippleBox, self).__init__(**kwargs)
        with self.canvas.before:
            Color(.5, .5, .5, 1, mode='rgba')
            self._rectangle = Rectangle(size=self.size, pos=self.pos)

    def on_release(self): # also tried passing '*args' as an argument, did not change anything
        print("got clicked!")

    def on_size(self, *args):
        self._rectangle.size = self.size
        self._rectangle.pos = self.pos

    def on_touch_down(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point:
            touch.grab(self)
            self.ripple_show(touch)
            return True
        return False

    def on_touch_up(self, touch):
        if touch.grab_current is self:
            touch.ungrab(self)
            self.ripple_fade()
            return True
        return False


class MainApp(App):
    def build(self):
        return RippleBox()


if __name__ == "__main__":
    MainApp().run()

标签: pythonpython-3.xkivy

解决方案


当您定义任何on_touch_down()oron_touch_up()方法时,您将on_touch_down()覆盖. 调度事件的方法,但如果它永远不会被调用,则不能这样做。这些方法还执行您的方法调用的and 。通常,当您重新定义这些方法时,您应该调用,如下所示:on_touch_up()TouchRippleButtonBehavioron_touch_up()TouchRippleButtonBehavioron_releaseTouchRippleButtonBehaviorself.ripple_show()self.ripple_fade()super()

    super(RippleBox, self).on_touch_down(touch)

推荐阅读