如何在Kivy中实现跨屏幕持续播放音频?
Kivy屏幕切换后音频持续播放的解决方案
问题根源在于你原来的代码中,Sound对象是a62类play_sound方法里的局部变量。当屏幕切换离开a62后,这个局部变量会被Python的垃圾回收机制清理,导致音频被迫停止。
要让音频在屏幕切换时持续播放,需要把Sound对象放在一个生命周期更长的位置——比如App实例中,这样它不会随单个Screen的切换被销毁。
修改后的Python代码
from kivy.app import App from kivy.uix.screenmanager import ScreenManager, Screen from kivy.clock import Clock from kivy.core.audio import SoundLoader from kivy.lang import Builder Builder.load_file("test1.kv") class a62(Screen): def on_enter(self, *args): Clock.schedule_once(self.play_sound, 1) Clock.schedule_once(self.next_screen4, 1.5) Clock.schedule_once(self.next_screen5, 2.5) def play_sound(self, dt): app = App.get_running_app() # 仅在音频未播放时启动 if app.sound and app.sound.state != 'play': print("playing sound123") app.sound.volume = 1 app.sound.play() def next_screen4(self, dt): self.manager.current = "a17" def next_screen5(self, dt): self.manager.current = "a18" class a17(Screen): pass class a18(Screen): pass class CandDApp(App): def build(self): # 将Sound对象作为App实例属性初始化 self.sound = SoundLoader.load('sound/music.mp3') sm = ScreenManager() sm.add_widget(a62(name="a62")) sm.add_widget(a17(name="a17")) sm.add_widget(a18(name="a18")) return sm def on_stop(self): # 退出应用时停止音频,释放资源 if self.sound: self.sound.stop() if __name__ == "__main__": CandDApp().run()
KV代码保持不变
<a62>: Button: text: "a62" <a17>: Button: text: "a17" <a18>: Button: text: "a18"
关键修改说明
- Sound对象全局化:把
SoundLoader.load的结果赋值给App的实例属性self.sound,让它的生命周期和整个应用绑定,不会因屏幕切换被回收。 - 跨Screen调用音频:在
a62的播放方法中,通过App.get_running_app()获取当前App实例,调用其sound属性来控制播放。 - 资源清理:添加
on_stop方法,在应用退出时停止音频,避免不必要的资源占用。 - 防重复播放:增加播放状态判断,确保只有在音频未播放时才触发播放操作。
内容的提问来源于stack exchange,提问作者Courtney G
相关产品推荐
相关产品推荐

