我对编程有点陌生。我正在使用 Kivy 框架构建一个简单的应用程序。该应用程序有 15 个按钮。当您按下按钮时,它开始播放旋律。如果此时正在播放任何其他按钮,它应该停止,即不应同时播放多个声音(来自不同实例)。
这就是我所做的——我创建了一个处理停止和播放声音的类方法。按下时,按钮实例将声音对象传递给此类方法。但是,在第一次按下时,由于声音对象还不存在,我的应用程序崩溃了。因此部分的原因try … except AttributeError
。
class Gumb(Button):
soundfile = StringProperty(None)
sound = ObjectProperty(None)
now_playing_object = None
def on_soundfile(self, instance, value):
self.sound = SoundLoader.load(value)
def on_press(self):
if self.sound:
self.__class__.play_sound(self.sound)
@classmethod
def play_sound(cls, new_sound_object):
try:
if cls.now_playing_object.state != 'stop':
cls.now_playing_object.stop()
except AttributeError:
pass
cls.now_playing_object = new_sound_object
cls.now_playing_object.play()
这行得通,但是我不喜欢它,尤其是那try … except
部分。必须有更好的方法来做到这一点。有任何想法吗?
谢谢!
更新1:
@toto_tico 为我提供了一些解决方案来规避该try ... except
部分。
使用
if
而不是异常:if cls.now_playing_object != None and cls.now_playing_object.state != 'stop': cls.now_playing_object.stop()
虽然,在阅读了关于 python 的 ifs 与异常的效率之后,我不确定我是否应该尝试消除
try ... except
。一开始就初始化
now_playing_object
。为此,我使用了:now_playing_object = SoundLoader.load(‘non_existant_file.wav’)
这可行,但感觉有点不可靠(奇怪的是,如果文件名缺少扩展名,Kivy 会抱怨,但如果根本没有文件则不会抱怨)。不过,我想我会用这个。
更新 2:
事实证明,解决方案就在我面前。我只是看不到它。真的没有必要@classmethod
:
class Gumb(Button):
...
def play_sound(self):
if self.__class__.now_playing_object.state is not 'stop':
self.__class__.now_playing_object.stop()
self.__class__.now_playing_object = self.sound
self.__class__.now_playing_object.play()
我已经接受了答案,但真正的答案在评论中。谢谢@toto_tico。