提问人:Elara Hart 提问时间:11/12/2023 最后编辑:Elara Hart 更新时间:11/13/2023 访问量:27
Kivy 无缝/无限滚动效果
Kivy Seamless/Infinite scrolling effect
问:
我编写了以下代码,试图制作一个无缝流动的图像,该图像是无限滚动的。(也许术语无限滚动在这种情况下具有误导性,但它应该无缝滚动,当图像的某个部分从底部消失时,它应该在消失后立即出现在顶部,这是无缝滚动)
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)
它有一些问题。
- 当它滚动时,直到第一张图像完全消失,它上面的图像才不会出现,因此必须完成图片的整个宽度,这并不能使滚动无缝。这不会产生连续滚动效果,因为它会使屏幕空白,直到第一张图片完全消失。
{我以为我可以使用同一图像的 2 个图像实例,然后在第一个图像消失时重置它,但我也无法实现任何代码。但老实说,我知道我们不需要 2 张图像来实现无缝滚动效果,而只需要一个应该连续滚动的实例。 如何实现无缝滚动?
- 当我像最大化一样拉伸应用程序窗口时,图片不会拉伸适合屏幕的宽度(因为它垂直滚动,我们不需要垂直而是水平)。在保持图像纵横比的同时,无论我如何调整大小,它是否可以根据窗口的大小进行拉伸?
{问题是,如果我突然调整它的大小,图像的整个滚动都会被重置,它再次从头开始,这不应该发生。
如何解决这个问题?
请帮助我如何解决这两个问题?你认为有没有办法修复它们,以便无缝(/无限)滚动与适合宽度而不是高度的图片一起发生?
答:
1赞
John Anderson
11/13/2023
#1
您可以使用两个对象来执行类似操作。下面是对使用此方法的类的修改:Image
App
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()
y
scroll_layer
0
评论
0赞
Elara Hart
11/13/2023
谢谢约翰。它就像一个魅力。不过一个问题(与主要问题无关)..为了学习Python,你有没有专门经历过的教程?我的意思是我可以处理,如果,在尝试/除了,def和其他一些小东西时,但我总是发现编写类或模块有点难以理解。任何建议或指示都会很棒。(请不要说 youtube,但如果您希望我在 youtube 上关注任何特定的人,我将不胜感激,但除此之外,编写复杂程序的任何其他方法都会有所帮助:)。谢谢一英里。
0赞
John Anderson
11/13/2023
我主要是边做边学。典型的“python”教程只涵盖了最基本的方面。Google 和 Stackoverflow 是获取更多详细信息的重要来源。例如,尝试在谷歌上搜索有关编写自定义类的更多详细信息。python custom class
上一个:分页和无限滚动功能
评论