自定义kivy事件问题

时间:2016-02-23 23:26:32

标签: python events kivy

我无法理解kivy的自定义事件。我正在使用kivy制作一个简单的音乐播放器,我想要一些基本的功能:当一首歌结束时,下一首歌会播放。 Kivy的声音类提供了2个事件,on_presson_stop

显然,这里的正确选择是on_stop。但是,当歌曲自然结束和用户手动停止时,都会触发此事件。事实是,我不希望后者发生,所以我决定创建一个自定义事件。在线提供的资源可以帮助我理解自定义事件,这些资源很少且令人困惑。以下是kivy文档中的示例:

class MyWidget(Widget):
    def __init__(self, **kwargs):
        super(MyWidget, self).__init__(**kwargs)
        self.register_event_type('on_swipe')

    def on_swipe(self):
        pass

def on_swipe_callback(*largs):
    print('my swipe is called', largs)
w = MyWidget()
w.dispatch('on_swipe')

因此,我们有事件(on_swipe)和事件处理程序(on_swipe_callback)。什么时候应该触发这个事件?我该如何定义?假设我希望我的事件被称为on_finish,我想让它在歌曲到达持续时间结束时被触发。我如何以及在何处撰写详细信息?如果有人能帮我理解这些事件是如何运作的,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

在调用dispatch时会触发事件。您问题中的代码中缺少的是bind。你有像

这样的东西
w = MyWidget()
w.bind(on_swipe=on_swipe_callback)

这会告诉w在事件on_swipe_callback发生时致电on_swipe

关于你原来的问题,这可能比它看起来更困难,因为在on_stop时,声音中的当前位置是未知的。 一个相当狡猾的解决方案可能是使用Clock来安排一个函数来检查声音是否仍然在声音结束之前播放。当然,这将是关闭,例如如果用户寻求。最后,您可能需要直接更改Sound中的kivy.audio类以生成新事件。

如果在用户界面中按下了停止按钮,则另一个选项是检查on_stop回调。如果不是,则歌曲“自然地”结束。您在按钮的on_press处理程序中设置了一个标记,并在on_stop处理程序中将其清除。