【问题标题】:How to return a widget inside a Layout in Kivy?如何在 Kivy 的布局中返回小部件?
【发布时间】:2014-05-20 21:30:53
【问题描述】:

我制作了一个非常简单的 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,它会在刷图像时失败,有点像有一个布局刷新阻止轮播正常传递图像。

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

【问题讨论】:

  • 你好,你能把你的整个代码贴出来吗?在我的脑海中,到目前为止唯一的答案是正确的,你应该只返回一次。但是,如果可以,我们将尝试通过修复上述问题来解决这个问题。但是,为此,我需要整个代码,如果以上还不是全部的话。
  • @Tshirtman 推送修复后问题已解决。尝试在 GitHub 上将您的 Kivy 更新为 master。现在可以在load_next 函数上设置schedule_interval

标签: python layout return kivy


【解决方案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

【讨论】:

  • 嘿 Nanashi,谢谢您的完整回答。实际上,我已经在您的代码中添加了 Clock 方法,让轮播自行滑动,但我仍然遇到同样的问题。如果没有return carousel,它不会正常滑动。太糟糕了,我不能发布一个 3 秒的短视频让你看到它的实际行为,因为这是一种非常奇怪的行为。
  • 我们必须等到 Tshirtman 推送的提交被解决,我们可能会在下一次更新中得到修复。老实说,你不能一次返回两件东西。这不是函数应该工作的方式。我将对此进行进一步测试。
  • 如何从 GitHub 获取最新版本?我只需要在 GitHub 上下载 zip 然后“sudo python setup.py install”吗?
  • 这是一种选择。另一种是克隆它。三是使用pip。在this SO post 上查看答案。
【解决方案2】:

只要去掉return carousel这一行,你只能返回一次,所以你需要返回包含所有其他的widget。

你还把Clock.schedule_interval 调用放在循环中,所以每秒有很多调用有元素,结果是无论如何它都会做一个完整的循环。只调用一次,所以把它移出循环。

【讨论】:

  • 我试过了,但是当我不return carousel 时,我的轮播出现了这种奇怪的行为。执行时似乎被冻结。
  • 你遇到的是 carousel 的 load_next 的一个 bug,我推送了 commit 6ef8c4 来修复它。
  • 所以你的意思是如果我现在导入 uix.carousel 就不会再有这个问题了?
  • 如果你更新了你的 kivy 版本,你应该不会再有这个问题了,如果你不能更新 kivy,在 Carousel() 调用中使用 min_move=.1 来解决这个错误。跨度>
  • 如何更新我的kivy版本?我只需要在 GitHub 上下载 zip 然后“sudo python setup.py install”吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-10
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多