2014-04-08 6 views
1

다른 레이아웃이있는 매우 간단한 Kivy 응용 프로그램을 만들었습니다. 내 앱을 GridLayout(rows=2)으로 분할해야합니다. 이렇게하면 화면 상단에 '헤더'가 있고 나머지 화면에는 carousel 또는 accordion을 가질 수 있습니다.Kivy의 레이아웃 내부에서 위젯을 반환하는 방법은 무엇입니까?

내 문제는 레이아웃에서 내 위젯을 반환하는 방법을 알 수 없다는 것입니다. 당신이 볼 수 있듯이, 내 레이아웃 안에 내 회전 목마를 표시하기 위해 그 2 return 필요하지만,이 방법은 회전 목마가 내 응용 프로그램에 나타납니다

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 carousel을 삭제하면 이미지를 스 와이프 할 때 오류가 발생합니다. 일반적으로 캐 러셀이 이미지를 전달하지 못하게하는 레이아웃 새로 고침이 있습니다.

내 레이아웃에서 코드를 재구성하여 좋은 회전식 컨베이어를 만들 수있는 아이디어가 있습니까?

+0

안녕하세요, 전체적으로이 코드를 게시 할 수 있습니까? 내 머리 꼭대기에서, 지금까지의 유일한 대답은 정확합니다. 한 번만 돌아와야합니다. 그러나 가능한 경우 위의 사항을 수정하여이를 해결하려고 노력할 것입니다. 그러나 위와 같은 것이 전부가 아니라면 전체 코드가 필요합니다. – Manhattan

+0

@Tshirtman이 수정 프로그램을 밀고 나면 문제가 해결되었습니다. GitHub에서 Kivy를 마스터로 업데이트 해보십시오. 'load_next' 함수에'schedule_interval'을 설정하면 이제 작동합니다. – Manhattan

답변

1

대규모 편집 : load_next 문제가 해결되었습니다로

다운로드 GitHub의에서 최신 버전. 다음 코드 결과를 올바르게 실행하면 정상적으로 작동합니다.

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을 참조하십시오.

+0

이봐, 나나시, 완전한 대답을 가져 주셔서 감사합니다. 사실 나는 당신의 codee에 Clock 메서드를 추가하여 컨베이어 자체를 스 와이프하고 여전히 같은 문제를 겪고 있습니다. '반환 회전 목마 '가 없다면 정상적으로 스 와이프되지 않습니다. 너무 이상한 행동이기 때문에 나는 그것이 실제로 어떻게 작동하는지 보도록 짧은 3 초 비디오를 게시 할 수 없습니다. – hacks4life

+0

밀린 커밋 Tshirtman이 해결 될 때까지 기다려야합니다. 그러면 다음 업데이트에서 수정 될 수 있습니다. 솔직히, 당신은 한 가지로 두 가지를 돌려 보낼 수 없습니다. 함수가 작동하는 방식이 아닙니다. 나는 이것을 더 시험 할 것이다. – Manhattan

+0

GitHub에서 최신 버전을 얻으려면 어떻게해야합니까? GitHub에서 zip 파일을 다운로드 한 다음 "sudo python setup.py install"을 다운로드하면됩니까? – hacks4life

1

return carousel 행을 삭제하면 한 번만 반환 할 수 있기 때문에 다른 모든 위젯을 포함하는 위젯을 반환해야합니다.

또한 루프에 Clock.schedule_interval 호출을 넣으므로 각 요소마다 요소가 많이 호출되므로 결과에 관계없이 완전한 루프가 수행됩니다. 이 호출은 한 번만 수행해야하므로 루프 밖으로 이동하십시오.

+0

나는 시도했다. 그러나 내가 회전 목마를 돌려주지 않을 때, 나는 나의 회전 목마에 관해서이 이상한 행동을 가지고있다. 실행하면 멈추는 것 같습니다. – hacks4life

+0

당신이 가진 것은 캐 러셀의 load_next가있는 버그였습니다. 6ef8c4를 수정하여 수정했습니다. – Tshirtman

+0

그래서 지금 uix.carousel을 가져 오면 더 이상이 문제가 발생하지 않을 것입니다. – hacks4life

관련 문제