Python Kivy切换至talkbot屏幕后如何播放视频?
问题:切换到TalkBot屏幕后自动播放视频
我希望切换到talkbot屏幕后,立即使用Kivy的Video模块播放视频。以下是我的代码:
#some imports used for other parts not included in code, irrelevant import kivy kivy.require('2.2.1') import pyttsx3 from kivymd.app import MDApp from kivy.uix.screenmanager import Screen, ScreenManager, FadeTransition from kivymd.uix.boxlayout import MDBoxLayout from kivy.uix.video import Video from kivy.uix.image import Image from kivy.uix.textinput import TextInput from kivymd.uix.button import MDRaisedButton from kivymd.uix.label import MDLabel #other code here, unimportant class TalkBot(Screen): def __init__(self, **kwa): super(TalkBot, self).__init__(**kwa) bgbox = MDBoxLayout() bgvid = Video(source="speechvid.avi", allow_stretch=True, keep_ratio=False, size_hint_y=1) bgvid.state="play" bgbox.add_widget(bgvid) self.add_widget(bgbox) class MindMagic(MDApp): def build(self): self.theme_cls.material_style = "M3" self._app_name = "MindMagic" self.icon = "logo.png" sm = ScreenManager(transition = FadeTransition()) sm.add_widget(winvid(name="winvid")) sm.add_widget(homeScreen(name="homeScreen")) sm.add_widget(TalkBot(name="talkbot")) return sm if __name__ == "__main__": MindMagic().run()
我尝试过以下方法,但视频根本没有显示在页面上:
if ScreenManager.current_screen == "talkbot": bgvid.state="play"
我全程用Python代码实现,未使用.kv文件,希望得到纯Python的解决方案。
解决方法
原代码的问题在于:在__init__方法中直接播放视频时,屏幕还未被显示,视频的播放状态无法正常触发;同时你尝试的ScreenManager.current_screen判断方式既没有获取到正确的实例,时机也不对。
正确的做法是利用Kivy Screen的on_enter事件——这个事件会在屏幕被切换显示时自动触发,刚好匹配你的需求。修改后的TalkBot类代码如下:
class TalkBot(Screen): def __init__(self, **kwa): super(TalkBot, self).__init__(**kwa) bgbox = MDBoxLayout() # 将bgvid设为实例属性,方便在on_enter中调用 self.bgvid = Video(source="speechvid.avi", allow_stretch=True, keep_ratio=False, size_hint_y=1) bgbox.add_widget(self.bgvid) self.add_widget(bgbox) def on_enter(self, *args): # 屏幕切换进来时播放视频 self.bgvid.state = "play" # 回到视频开头,避免多次切换时从上次位置继续播放 if self.bgvid.loaded: self.bgvid.seek(0) else: # 若视频未加载完成,绑定加载完成事件后回到开头 self.bgvid.bind(on_load=lambda _, __: self.bgvid.seek(0))
关键说明
on_enter是Screen类的内置回调,每次屏幕被激活显示时都会执行,确保视频在屏幕可见时才开始播放。- 将
bgvid保存为实例属性,才能在on_enter方法中访问并控制它。 - 添加
seek(0)是为了保证每次切换到该屏幕时,视频都从头开始播放,而不是延续上次的进度。 - 处理视频未加载完成的情况,避免因视频未就绪导致播放失败。
另外,请确保speechvid.avi文件路径正确,可放在项目根目录,或使用绝对路径指定文件位置。
内容的提问来源于stack exchange,提问作者Spaceyy64
相关产品推荐
相关产品推荐

