试图在kivy中构建一个节拍器 - 事件循环管理

Mat*_*uor 1 python events loops kivy

因为我在这里找不到任何东西,所以我试着提出我的问题.

我正试图在kivy中构建一个简单的节拍器.我基本上采用了随安装提供的音频示例,并希望添加一个节拍器功能.

class AudioButton(ToggleButton):

    filename = StringProperty(None)
    sound = ObjectProperty(None)

    def on_filename(self, instance, value):
        # the first time that the filename is set, we are loading the sample
        if self.sound is None:
            self.sound = SoundLoader.load(value)

    def on_press(self):
        # stop the sound if it's currently playing
        if self.sound.status != 'stop':
            self.sound.stop()
        self.sound.play()
Run Code Online (Sandbox Code Playgroud)

如您所见,我将课程从更改ButtonToggleButton.

我试图用一个while循环self.sound.play(),但结果是无穷大,所以基本上我正在寻找一种方法来摆脱循环,如果我再次按下按钮.

我没有真正理解文档中的事件循环管理,我认为应该是答案,但我之前从未使用过事件循环.如果有人可以为这种情况提供一些示例代码,那就太好了.

bgp*_*ter 6

你想要开始寻找的地方是讨论时钟事件的Kivy文档.在像这样的事件驱动系统中,任何类型的while循环都会使系统屈服.相反,当你想要定期发生某些事情时,你要求系统设置一个计时器并告诉它你每次计时器过去时想要调用的函数.

在你的情况下,你可能只是播放那个单节拍器,并在下次定时器结束时完成.

  • 你可以在on_press上设置clock事件,在on_release上删除它,或者在程序开头设置它,并且每次检查按钮的状态,无论如何,你可能想要比这更复杂的东西,因为大多数节拍器可以改变速度,所以你需要每帧调用你的时钟事件,检查按钮是否关闭以及是否必须发生下一个滴答,如果是,则执行声音并计算下一个滴答的时间,依此类推. (2认同)