gif只播放一次后如何将屏幕从一个屏幕切换到另一个屏幕

问题描述 投票:0回答:1

在过去的几天里,我一直在努力解决 Kivy 中更换屏幕这一看似微不足道的问题。我有这个持续 6 秒的 gif 动画(至少根据我在 Canva 中创建的 Canva 来看)。我有一个带有此 gif 的屏幕,我想在玩家有机会玩游戏之前播放它。就像介绍一样。

所以我想要的是我希望这个 gif 只播放一次,然后我想立即过渡到主游戏。

** 我遇到的问题:**

  1. gif 从一开始就没有播放。尽管事实上,如果您下载并打开它,它会正常播放,但它还是从末尾开始。在Kivy中,有时它从中间开始,有时从末尾开始等等。这是非常不规则的,我不知道是什么对其产生影响。

  2. 我不知道如何告诉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 和其他地方找到解决方案。但我尝试的是:

  1. 我尝试使用 ScreenManager 并将这两个屏幕(“final_round_animation”、“main_game_trial”)放在一个类和一个 kivy 文件中。接下来,我尝试使用 Clock.schedule_once 来安排 6 秒(gif 的持续时间)后的转换,就像此处的视频所示:

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 根本不起作用。 gif 继续无休止地循环,就好像这个 on_enter 函数根本不可见一样。我也尝试在函数名称后面加上括号这样写,但它没有改变任何东西:

Clock.schedule_once(self.change_screen(), 6)

我得出的结论是,它不像视频中那样工作的事实是因为我尝试在项目的某个部分的某个类中执行此操作,并且在该视频中显示它是在文件中制作的通过应用程序。

  • 我记得当我第一次尝试使用“main_game_Trial”时,我肯定遇到了“kivy.uix.screenmanager.ScreenManagerException: No Screen with name”。无论如何,即使我修复了这个错误,即使屏幕名称被识别,转换也根本不会发生。
  1. 我尝试在 kivy 文件中使用

    anim_loop
    ,然后在 py 文件中引用它。基本上我想创建一个条件,如果 anim_loop 大于 1,则移动到不同的屏幕。然而,无济于事。例如,当我将 anim_loop 设置为 2 时,gif 根本不播放。我不知道为什么。如果我将其设置为 10,它就会无限循环。

  2. 尝试应用我在寻找解决方案时遇到的 Stack Overflow 线程中的数十种不同情况。

如果您能帮助我,我将非常感激。

提前感谢您的输入。

python kivy kivy-language kivymd
1个回答
0
投票

理想情况下,

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
更改。

© www.soinside.com 2019 - 2024. All rights reserved.