如何在Kivy的布局中返回一个小部件?
我做了一个非常简单的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()
确保你把图片文件换成你自己使用的文件,并且更新标签/文本。现在应该可以正常工作了。
可以在这里观看演示视频。