Kivy 无缝/无限滚动效果

Kivy Seamless/Infinite scrolling effect

提问人:Elara Hart 提问时间:11/12/2023 最后编辑:Elara Hart 更新时间:11/13/2023 访问量:27

问:

我编写了以下代码,试图制作一个无缝流动的图像,该图像是无限滚动的。(也许术语无限滚动在这种情况下具有误导性,但它应该无缝滚动,当图像的某个部分从底部消失时,它应该在消失后立即出现在顶部,这是无缝滚动)

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
from kivy.clock import Clock

class ScrollingImageApp(App):
    def build(self):
        self.root = BoxLayout(orientation='vertical')

        # Create a non-interfering layer for scrolling image
        self.scroll_layer = Image(source='pexels-tessa-k-896673.jpg', allow_stretch=True, keep_ratio=False)
        self.root.add_widget(self.scroll_layer)

        # Schedule the scroll function to be called every frame
        Clock.schedule_interval(self.scroll_image, 1 / 60.0)

        return self.root

    def scroll_image(self, dt):
        # Scroll the image vertically
        self.scroll_layer.y -= 1
        if self.scroll_layer.y < -self.scroll_layer.height:
            self.scroll_layer.y = self.root.height

if __name__ == '__main__':
    ScrollingImageApp().run()


# Image source: https://www.pexels.com/photo/timelapse-photo-of-gray-clouds-896673/
# The above image was made seamless using Gimp software (photoshop alternative)

它有一些问题。

  1. 当它滚动时,直到第一张图像完全消失,它上面的图像才不会出现,因此必须完成图片的整个宽度,这并不能使滚动无缝。这不会产生连续滚动效果,因为它会使屏幕空白,直到第一张图片完全消失。

{我以为我可以使用同一图像的 2 个图像实例,然后在第一个图像消失时重置它,但我也无法实现任何代码。但老实说,我知道我们不需要 2 张图像来实现无缝滚动效果,而只需要一个应该连续滚动的实例。 如何实现无缝滚动?

  1. 当我像最大化一样拉伸应用程序窗口时,图片不会拉伸适合屏幕的宽度(因为它垂直滚动,我们不需要垂直而是水平)。在保持图像纵横比的同时,无论我如何调整大小,它是否可以根据窗口的大小进行拉伸?

{问题是,如果我突然调整它的大小,图像的整个滚动都会被重置,它再次从头开始,这不应该发生。

如何解决这个问题?

请帮助我如何解决这两个问题?你认为有没有办法修复它们,以便无缝(/无限)滚动与适合宽度而不是高度的图片一起发生?

Kivy 无限卷轴 python-3.9

评论


答:

1赞 John Anderson 11/13/2023 #1

您可以使用两个对象来执行类似操作。下面是对使用此方法的类的修改:ImageApp

class ScrollingImageApp(App):
    def build(self):
        self.root = BoxLayout(orientation='vertical')

        # Add a FloatLayout to contain the scrolling Images
        fl = FloatLayout()
        self.upper_image = Image(source='pexels-tessa-k-896673.jpg', allow_stretch=True, keep_ratio=False)
        self.scroll_layer = Image(source='pexels-tessa-k-896673.jpg', allow_stretch=True, keep_ratio=False)
        fl.add_widget(self.upper_image)
        fl.add_widget(self.scroll_layer)
        self.root.add_widget(fl)

        # # Schedule the scroll function to be called every frame
        Clock.schedule_interval(self.scroll_image, 1 / 60.0)

        return self.root

    def scroll_image(self, dt):
        # Scroll the image vertically
        self.scroll_layer.y -= 1
        if self.scroll_layer.y < -self.scroll_layer.height:
            self.scroll_layer.y = 0  # reset to starting position

        # adjust the position of the upper Image
        self.upper_image.y = self.scroll_layer.y + self.scroll_layer.height

请注意,该方法将值(下图)重置为下图从屏幕上滚动时。它还将上部图像定位在下部图像的正上方。scroll_image()yscroll_layer0

评论

0赞 Elara Hart 11/13/2023
谢谢约翰。它就像一个魅力。不过一个问题(与主要问题无关)..为了学习Python,你有没有专门经历过的教程?我的意思是我可以处理,如果,在尝试/除了,def和其他一些小东西时,但我总是发现编写类或模块有点难以理解。任何建议或指示都会很棒。(请不要说 youtube,但如果您希望我在 youtube 上关注任何特定的人,我将不胜感激,但除此之外,编写复杂程序的任何其他方法都会有所帮助:)。谢谢一英里。
0赞 John Anderson 11/13/2023
我主要是边做边学。典型的“python”教程只涵盖了最基本的方面。Google 和 Stackoverflow 是获取更多详细信息的重要来源。例如,尝试在谷歌上搜索有关编写自定义类的更多详细信息。python custom class