我无法理解kivy的自定义事件。我正在使用kivy制作一个简单的音乐播放器,我想要一些基本的功能:当一首歌结束时,下一首歌会播放。 Kivy的声音类提供了2个事件,on_press
和on_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
,我想让它在歌曲到达持续时间结束时被触发。我如何以及在何处撰写详细信息?如果有人能帮我理解这些事件是如何运作的,我将不胜感激。
答案 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
处理程序中将其清除。