如何在Kivy的布局中返回一个小部件?

1 投票
2 回答
1703 浏览
提问于 2025-04-18 01:50

我做了一个非常简单的Kivy应用程序,里面有不同的布局。我想把我的应用分成一个GridLayout(rows=2),这样我就可以在屏幕顶部放一个“头部”,而在屏幕的其他部分放一个carousel(轮播图)或者accordion(手风琴式菜单)。

我的问题是,我不知道怎么把我的小部件放到布局里面。

这是我的代码:

class Logo(App):

    def build(self):
        layout = GridLayout(rows=2)
        layoutTop = FloatLayout()
        layoutMid = FloatLayout()

        logo = Image(source='imagine.png',size_hint=(.25,.25),pos=(30,380))
        titre = Label(text='#LeCubeMedia',font_size='40sp',pos=(0,280))
        ip = Label(text='192.168.42.1',font_size='25sp',pos=(250,280))

        carousel = Carousel(direction='right', loop = True, size_hint=(.5,.5),pos=(300,180))
        for i in range(2):
                src = "imagine.png"
                image = Factory.AsyncImage(source=src, allow_stretch=True)
                carousel.add_widget(image)
                Clock.schedule_interval(carousel.load_next, 1)
        return carousel ------> 1st Return

        layoutTop.add_widget(titre)
        layoutTop.add_widget(logo)
        layoutTop.add_widget(ip)
        layoutMid.add_widget(carousel)

        layout.add_widget(layoutTop)
        layout.add_widget(layoutMid)

        return layout ------> 2nd Return

if __name__ == '__main__':

    Logo().run()

如你所见,我需要这两个return来显示我的轮播图在布局里面,但这样的话,应用里只会出现轮播图。如果我删除return carousel,那么在滑动图片时就会出问题,感觉像是布局刷新了,导致轮播图无法正常切换图片。

有没有什么想法可以让我重新组织代码,让我的轮播图能好好地放在布局里面呢?

2 个回答

1

只需要把 return carousel 这一行去掉就行了,因为你只能返回一次,所以你需要返回一个包含所有其他内容的组件。

另外,你把 Clock.schedule_interval 的调用放在了循环里,这样每秒的调用次数就和元素的数量一样多。结果就是无论如何都会执行完整个循环。这个调用只需要执行一次,所以把它移到循环外面。

1

大更新:

请从GitHub下载最新版本,因为load_next的问题已经在那边解决了。 运行下面的代码会得到预期的效果。

from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.carousel import Carousel
from kivy.uix.image import Image
from kivy.factory import Factory
from kivy.clock import Clock

class Logo(App):

    def build(self):

        main_layout = GridLayout(cols=1, rows=2)
        top_row = GridLayout(cols=3, rows=1)
        bottom_row = GridLayout(cols=1)

        logo = Image(source='bird.jpg')
        title = Label(text='Just three birds.',font_size='40sp')
        ip = Label(text='tweet\ntweet\ntweet',font_size='20sp')

        carousel = Carousel(direction='right', loop=True, size_hint=(.5,.5),pos=(0,180))

        for i in range(1,4):
            src = "bird%s.jpg" % str(i)
            image = Factory.AsyncImage(source=src, allow_stretch=True)
            carousel.add_widget(image)
        Clock.schedule_interval(carousel.load_next, 1.0)

        top_row.add_widget(logo)
        top_row.add_widget(title)
        top_row.add_widget(ip)
        bottom_row.add_widget(carousel)

        main_layout.add_widget(top_row)
        main_layout.add_widget(bottom_row)

        return main_layout

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

确保你把图片文件换成你自己使用的文件,并且更新标签/文本。现在应该可以正常工作了。

可以在这里观看演示视频。

撰写回答