Kivy中GIF单次播放后自动切换屏幕的实现求助
解决方案:Kivy中GIF启动页单次播放后自动切屏
一、修复GIF起始位置异常问题
Kivy加载GIF时偶尔会因缓存或加载顺序导致起始帧错乱,通过在屏幕进入时强制重置动画帧即可解决:
- 在
FinalRoundAnimation的on_enter方法中,将GIF的anim_index设为0,强制从第一帧开始播放。
二、实现单次播放后自动切屏
放弃硬编码时长的方式,通过计算GIF总帧数和单帧延迟得到准确播放时长,再用Clock.schedule_once调度切屏;同时避免之前的调用错误(不要给方法加括号)。
修改后的完整代码
Python文件
from kivy.uix.screenmanager import Screen from kivy.clock import Clock class FinalRoundAnimation(Screen): def on_enter(self, *args): # 重置GIF到第一帧,解决起始位置异常 gif = self.ids.gif gif.anim_index = 0 # 计算GIF总播放时长(帧数 × 单帧延迟) total_frames = len(gif.image.textures) total_duration = total_frames * gif.anim_delay # 调度切屏,加0.1秒缓冲避免提前切换 Clock.schedule_once(self.change_screen, total_duration + 0.1) def change_screen(self, *args): # 切换到目标屏幕,确保ScreenManager中已注册该屏幕 self.manager.current = 'main_game_trial' # 主游戏屏幕示例(根据你的实际代码调整) class MainGameTrial(Screen): pass
Kivy文件
<FinalRoundAnimation> name: 'final_round_animation' FloatLayout: size: 1280, 720 Image: id: gif source:'Final Round Animation.gif' anim_delay: 0.03 allow_stretch: True keep_ratio: False # 禁用无限循环,设为1表示播放一次后停止 anim_loop: 1
主App文件(确保ScreenManager正确配置)
from kivy.app import App from kivy.uix.screenmanager import ScreenManager class MyGameApp(App): def build(self): sm = ScreenManager() # 添加动画屏幕和主游戏屏幕 sm.add_widget(FinalRoundAnimation(name='final_round_animation')) sm.add_widget(MainGameTrial(name='main_game_trial')) return sm if __name__ == '__main__': MyGameApp().run()
关键注意事项
- 避免
Clock.schedule_once的调用错误:之前的Clock.schedule_once(self.change_screen(), 6)会立即执行change_screen,正确写法是Clock.schedule_once(self.change_screen, 6)(不带括号)。 - 确保屏幕名称一致:
ScreenManager中添加的屏幕名称必须和self.manager.current设置的名称完全匹配,否则会出现No Screen with name错误。 - 关于
anim_loop:设为1表示GIF播放一次后停止,若之前设置后无法播放,检查GIF是否为标准格式(Canva导出的GIF通常没问题,可尝试重新导出)。
内容的提问来源于stack exchange,提问作者dm123
相关产品推荐
相关产品推荐

