I made a very simple Kivy application in which I have different layouts. I need to split my app into a GridLayout(rows=2)
, this way I can have a "header" at the top of the screen, and a carousel
or accordion
in the rest of the screen.
My problem is that I can't figure out how to return my widget inside the layout.
Here's my code :
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()
As you can see, I need those 2 return
in order to display my carousel inside my layout, but this way only the carousel will appear in my app. If I delete the return carousel
, it will fail at swiping Images, a bit like there's a layout refresh that prevent the carousel from passing images normally.
Any ideas how I can re-structure the code to have a good carousel inside my layout ?
Just remove the return carousel
line, you can only return one time, so you need to return the widget that contains all the others.
Also you put the Clock.schedule_interval
call in the loop, so there is at much call each second that there is elements, consequence is that it will do a complete loop no matter what. only do this call one time, so move it out of the loop.
MASSIVE EDIT:
Download the latest version from GitHub, as the load_next
issue has been resolved there. Running the following code results into the proper intended behavior.
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()
Make sure you change the image files to the ones you are using as well as the labels/text. It should work now.
See the demo video here .
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.