在过去的几天里,我一直在努力解决 Kivy 中更换屏幕这一看似微不足道的问题。我有这个持续 6 秒的 gif 动画(至少根据我在 Canva 中创建的 Canva 来看)。我有一个带有此 gif 的屏幕,我想在玩家有机会玩游戏之前播放它。就像介绍一样。
所以我想要的是我希望这个 gif 只播放一次,然后我想立即过渡到主游戏。
** 我遇到的问题:**
gif 从一开始就没有播放。尽管事实上,如果您下载并打开它,它会正常播放,但它还是从末尾开始。在Kivy中,有时它从中间开始,有时从末尾开始等等。这是非常不规则的,我不知道是什么对其产生影响。
我不知道如何告诉Kivy在动画完成后改变屏幕。我尝试使用 Clock.schedule_once 但由于某种原因我无法让它工作,尽管我一直在遵循我在 Stack Overflow 和 YouTube 上找到的建议。
我不会包含整个代码,因为它很长(正如我提到的,我已经在这个项目上工作了一段时间,它由几个不同的类和文件组成),但在下面你可以找到我的 python 和 Kivy 文件对于“final_round_animation”。 **我需要的只是将其移动到不同的屏幕。您可以使用白色背景的空白屏幕。没关系。我所需要的只是找出如何正确播放该 gif 一次,然后从该屏幕移动到另一个屏幕。 **
py 文件
from kivy.uix.screenmanager import Screen
class FinalRoundAnimation(Screen):
pass
kivy 文件:
<FinalRoundAnimation>
name: 'final_round_animation'
FloatLayout:
orientation: 'horizontal'
size: 1280, 720
Image:
id: gif
source:'Final Round Animation.gif'
anim_delay: 0.03
allow_stretch: True
keep_ratio: False
keep_data: True
我已经花了几天时间试图在 Stack Overflow 和其他地方找到解决方案。但我尝试的是:
https://youtu.be/fq9yA_XVzLA?t=329
这是这种风格的东西:
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.clock import Clock
class Swap(ScreenManager):
def on_enter(self):
Clock.schedule_once(self.change_screen, 6)
def change_screen(self):
self.current = 'main_game_trial'
class FinalRoundAnimation(Screen):
pass
class MainGameTrial(Screen):
pass
这种方法的问题如下”
Clock.schedule_once(self.change_screen(), 6)
我得出的结论是,它不像视频中那样工作的事实是因为我尝试在项目的某个部分的某个类中执行此操作,并且在该视频中显示它是在文件中制作的通过应用程序。
我尝试在 kivy 文件中使用
anim_loop
,然后在 py 文件中引用它。基本上我想创建一个条件,如果 anim_loop 大于 1,则移动到不同的屏幕。然而,无济于事。例如,当我将 anim_loop 设置为 2 时,gif 根本不播放。我不知道为什么。如果我将其设置为 10,它就会无限循环。
尝试应用我在寻找解决方案时遇到的 Stack Overflow 线程中的数十种不同情况。
如果您能帮助我,我将非常感激。
提前感谢您的输入。
理想情况下,
Image
类会在 gif 动画结束时触发一个事件,但事实并非如此。您可以通过扩展 Image
类来模拟这一点:
class MyImage(Image):
complete = BooleanProperty(False)
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.anim_loop = 1 # only allow one animation loop
self.textures_used = 0
self.num_textures = None
def on_texture(self, image, texture):
if self.num_textures is None:
self.num_textures = len(self._coreimage.image.textures)
self.textures_used += 1
if self.num_textures == self.textures_used:
self.complete = True
然后在你的
kv
中使用这个新类:
<FinalRoundAnimation>:
name: 'final_round_animation'
FloatLayout:
orientation: 'horizontal'
size: 1280, 720
MyImage:
id: gif
source:'Final Round Animation.gif'
anim_delay: 0.03
allow_stretch: True
keep_ratio: False
keep_data: True
on_complete: root.manager.current='main_game_trial'
on_complete
现在会触发 Screen
更改。