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

时间:2014-04-08 09:20:57

标签: python layout return kivy

我制作了一个非常简单的Kivy应用程序,其中我有不同的布局。我需要将我的应用分成GridLayout(rows=2),这样我可以在屏幕顶部显示“标题”,并在屏幕的其余部分显示carouselaccordion

我的问题是我无法弄清楚如何在布局中返回我的小部件。

这是我的代码:

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()

正如您所看到的,我需要那些2 return才能在我的布局中显示我的轮播,但这样只有轮播才会显示在我的应用中。如果我删除了return carousel,它会在刷图像时失败,有点像布局刷新会阻止旋转木马正常传递图像。

我有什么想法可以重新构造代码,在我的布局中有一个好的轮播?

2 个答案:

答案 0 :(得分:1)

只需删除return carousel行,您只能返回一次,因此您需要返回包含所有其他内容的小部件。

此外,您将Clock.schedule_interval调用放入循环中,因此每秒都会调用有多少元素,结果是无论如何都会完成一个完整的循环。只做一次这个调用,所以把它移出循环。

答案 1 :(得分: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()

确保将图像文件更改为您正在使用的图像文件以及标签/文本。它现在应该工作。

观看演示视频here