【问题标题】:How to use touchripple.py with Kivy lang?如何将 touchripple.py 与 Kivy lang 一起使用?
【发布时间】:2019-01-11 13:34:04
【问题描述】:

我正在尝试使用 kivy.uix.behaviors 中的 touchripple.py 创建一个按钮。然而,我最终没有成功。任何人都可以使用 Kivy lang 展示一个带有按钮的触摸波纹的简单示例吗?提前致谢。 现在,只有涟漪效应还没有显示出来。请指教。谢谢。

在rippleexample2.py中:

from kivy.app import App
from kivy.uix.touchripple import TouchRippleBehavior
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.properties import (StringProperty, NumericProperty, ObjectProperty,
ListProperty, DictProperty, BooleanProperty)

class RippleButton(TouchRippleBehavior, Button):
    isRippled = BooleanProperty(False)

    def __init__(self, **kwargs):
        super(RippleButton, self).__init__(**kwargs)

    def on_touch_down(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point and not self.isRippled:
            self.isRippled = True
            self.ripple_show(touch)
        return super(RippleButton, self).on_touch_down(touch)

    def on_touch_up(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point and self.isRippled:
            self.isRippled = False
            self.ripple_fade()
        return super(RippleButton, self).on_touch_up(touch)

    def doit(self, *args):
        print('in doit')

 class Login(Screen):
    pass

class MainScreen(Screen):
    pass

class ScreenManager(ScreenManager):
    pass

MainScreen = Builder.load_file("rippleexample2.kv")

class SimpleKivy4(App):
    def build(self):
        return MainScreen

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

在rippleexample2.kv中:

ScreenManager:
    Login:
    MainScreen:

<Login>:
    name:"login"
    RippleButton:
        text:'Login'
        font_size: 24
        on_release: app.root.current = "main"


<MainScreen>:
    name: "main"
    RippleButton:
        text: 'back'
        on_release: app.root.current = "login"

【问题讨论】:

  • 欢迎来到 SO。你的问题到底是什么?什么“以失败告终”?提供有关您的问题的更多详细信息并展示一些工作证明,以便其他人可以更好地帮助您。
  • 大家好,我仍然遇到连锁反应的问题。谁能帮忙。

标签: python-3.x kivy


【解决方案1】:

下面是一个用于创建 Button 的 sn-p,它在交互时呈现触摸波纹动画:

片段

class RippleButton(TouchRippleBehavior, Button):

    def on_touch_down(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point:
            touch.grab(self)

            # The background_color (r, g, b, a) of button widget defaults to [1, 1, 1, 1]
            # where 'a' (alpha compositing or transparency) is 1 i.e. not transparent

            self.transparency = self.background_color[3]    # backup original transparency / alpha compositing
            self.background_color[3] = 0.5  # set transparency to half (0.5)

            self.ripple_show(touch)

            # dispatch on_press event because we have consumed on_touch_down
            self.dispatch('on_press')

            # consumed touch down and don’t want it to propagate any further.
            return True
        return False

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

            # defer on_release until ripple_fade has completed
            def defer_release(dt):
                self.background_color[3] = self.transparency  # restore transparency / alpha compositing
                self.dispatch('on_release')

            Clock.schedule_once(defer_release, self.ripple_duration_out)

            # consumed touch up and don’t want it to propagate any further.
            return True
        return False

示例

main.py

​​>
from kivy.app import App
from kivy.uix.behaviors.touchripple import TouchRippleBehavior
from kivy.uix.button import Button
from kivy.uix.screenmanager import Screen
from kivy.lang import Builder
from kivy.clock import Clock


class RippleButton(TouchRippleBehavior, Button):

    def on_touch_down(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point:
            touch.grab(self)

            # The background_color (r, g, b, a) of button widget defaults to [1, 1, 1, 1]
            # where 'a' (alpha compositing or transparency) is 1 i.e. not transparent

            self.transparency = self.background_color[3]    # backup original transparency / alpha compositing
            self.background_color[3] = 0.5  # set transparency to half (0.5)

            self.ripple_show(touch)

            # dispatch on_press event because we have consumed on_touch_down
            self.dispatch('on_press')

            # consumed touch down and don’t want it to propagate any further.
            return True
        return False

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

            # defer on_release until ripple_fade has completed
            def defer_release(dt):
                self.background_color[3] = self.transparency  # restore transparency / alpha compositing
                self.dispatch('on_release')

            Clock.schedule_once(defer_release, self.ripple_duration_out)

            # consumed touch up and don’t want it to propagate any further.
            return True
        return False

    def doit(self, *args):
        print('in doit')


class Login(Screen):
    pass


class MainScreen(Screen):
    pass


class SimpleKivy4(App):
    def build(self):
        return Builder.load_file("main.kv")


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

main.kv

#:kivy 1.11.0

ScreenManager:
    Login:
    MainScreen:

<Login>:
    name:"login"
    RippleButton:
        text:'Login'
        font_size: 24
        on_release: root.manager.current = "main"


<MainScreen>:
    name: "main"
    RippleButton:
        text: 'back'
        on_release: root.manager.current = "login"

输出

【讨论】:

  • 您好 Ikolim,非常感谢您的帮助,真的很鼓舞人心。
【解决方案2】:

在仔细查看示例后,我注意到他们在RippleButton 中做了一些奇怪的事情。由于某种未知原因,他们正在停止发送触摸事件。我已经修改了代码以继续调度(所以现在on_release 应该可以工作)。我添加了一个BooleanProperty 来跟踪TouchRipple Behavior 是否有效。

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import BooleanProperty
from kivy.uix.behaviors import TouchRippleBehavior
from kivy.uix.button import Button


class RippleButton(TouchRippleBehavior, Button):
    isRippled = BooleanProperty(False)

    def __init__(self, **kwargs):
        super(RippleButton, self).__init__(**kwargs)

    def on_touch_down(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point and not self.isRippled:
            self.isRippled = True
            self.ripple_show(touch)
        return super(RippleButton, self).on_touch_down(touch)

    def on_touch_up(self, touch):
        collide_point = self.collide_point(touch.x, touch.y)
        if collide_point and self.isRippled:
            self.isRippled = False
            self.ripple_fade()
        return super(RippleButton, self).on_touch_up(touch)

    def doit(self, *args):
        print('in doit')

theRoot = Builder.load_string('''
RippleButton:
    text: 'Click Here'
    on_release: self.doit()
''')

class TouchRippleApp(App):
    def build(self):
        return theRoot

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

【讨论】:

  • 您好约翰·安德森,非常感谢。但是嗯,涟漪效应仍然不起作用,但 on_release 现在正在起作用。不知道如何解决。
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多