【发布时间】:2013-07-29 04:10:21
【问题描述】:
我对编程有点陌生。我正在使用 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()
我已经接受了答案,但真正的答案在 cmets 中。谢谢@toto_tico。
【问题讨论】:
标签: python oop python-2.7 kivy