2016-11-26 7 views
1

kivy를 사용하여 응용 프로그램을 만들면 원하는 모든 것을 얻을 수 있지만 화면을 세로에서 가로로 회전하면 위젯이 서로 충돌하기 시작합니다. 이것이 일어나지 않도록하는 좋은 방법은 무엇입니까?python/kivy를 사용하여 화면 회전을 설명하기 위해 위젯 배치를 처리하는 좋은 방법은 무엇입니까?

첨부 된 예제에서 설정 버튼을 내 머리글 레이블 위젯에 바인딩 할 수 있었지만 스크롤 할 때 내 스크롤 뷰를 가져 오지 못해 회전 할 때 X 공간을 남겨 둡니다. 라벨의 하단.

파이썬 :

class First_Screen(Screen): 
    def __init__(self, **kwargs): 
     super(First_Screen, self).__init__(**kwargs) 
     list_of_buttons = [ 
     'button1', 
     'button2', 
     'button3', 
     'button4', 
     'button5', 
     'button6 ', 
     'button7', 
     'button8', 
     ] 

     class My_Grid(FloatLayout, ScrollView): 
      grid = ObjectProperty(None) 

      def on_grid(self, *args): 
       for btn in list_of_buttons: 
        btn = Button(
         text = btn, 
         ) 
        btn.bind(on_press= First_Screen.print_message) 
        self.grid.add_widget(btn) 


    def print_message(self): 
     print ('Congratulations! You have clicked a button!') 

class ScreenManagement(ScreenManager): 
    pass 

class Stack_Overflow(App): 
    def build(self): 
     sm = ScreenManager(transition = FadeTransition()) 
     sc0 = First_Screen(name = 'first_screen') 
     sm.add_widget(sc0) 
     return sm 


if __name__ == '__main__': 
    Stack_Overflow().run() 

KV :

ScreenManagement: 
    First_Screen: 

<[email protected]+Image>: 


<First_Screen>: 
    name: 'first_screen' 

    Label: 
     id: header 
     text: 'header' 
     pos_hint: ({'left' : 1, 'top' : 1}) 
     size_hint: (1,None) 
     height: dp(50) 
     canvas.before: 
      Color: 
       rgba: (.6, .6, .6, 1) 
      Rectangle: 
       pos: self.pos 
       size: self.size 

    ScrollView: 
     size_hint: (1,.8) 
     pos_hint: ({'center_x' : .5, 'center_y' : .5}) 

     My_Grid: 
      grid: grid 
      GridLayout: 
       id: grid 
       cols: 1 
       size_hint_y: None 
       row_default_height: "40dp" 
       height: self.minimum_height 



    ImageButton: 
     id: settings 
     size_hint: None, None 
     height: dp(30) 
     width: dp(30) 
     pos: header.x, header.y + 10 
     pos_hint: {'right': 1} 
     source: 'settings_black.png' 

이미지 : portrait, landscape

감사합니다!

답변

0

편집 : 질문을 오해 한 것 같습니다. Image에 만족하지 못했다고 생각했습니다. ScrollView의 경우 문제는 상대 위치와 크기를 사용하기 때문에 ScrollView 자체가 아닙니다.

문제는 절대 번호 즉 50 고밀도 픽셀 높이로 설정 한 Label (헤더)이다. 즉, 어떤 화면이든 다른 크기의 화면이든,이 위젯의 ​​화면 크기는 dpi 인 corrected의 50 픽셀입니다.

현실에서이 화면이 400x100 해상도에 도달하면, 당신의 Label가 화면의 절반을하고 ScrollView이 (그런 다음 Label 표시되지 않습니다 가능성이 가장 높은) 그 위에 배치됩니다 것을 의미합니다.

두 가지 옵션이 있습니다. FloatLayout 만 사용하려면 올바른 위치 지정/크기 조정 즉 을 사용해야하며 위젯이 겹쳐져 있지 않은지 확인해야합니다.

class First_Screen(BoxLayout, Screen): 
    def __init__(self, **kwargs): 
     super(First_Screen, self).__init__(orientation='vertical', **kwargs) 

또는 다른 조금 (더 나은 찾고) :

그렇지 않으면 단지 BoxLayout 또는 자체에 그런 일을 관리하는 유사한 다른 레이아웃에 위젯을 드롭

class First_Screen(BoxLayout, Screen): 
    def __init__(self, **kwargs): 

및 KV에서 :

<First_Screen>: 
    name: 'first_screen' 
    orientation: 'vertical' 

는 또한 screen module가 있음을주의 이는 apk로 코드를 삭제하는 것보다 더 쉬운 방법으로 테스트하는 것이고, 단지 불필요한 경우에만 안드로이드에 적용하는 것입니다. 예 :

python main.py -m screen:note2,landscape,scale=.5 
+0

내 설정 버튼은 실제로 내가 원하는대로 정확하게 작동합니다. 나는 그것이 전화를 돌릴 때 머리말 꼬리표의 중앙에 아직도 중심에 남아있을 때 이렇게 그것을 설치해달라고했다.내 주요 문제는 내 scrollview 위젯을 내 머리글 레이블 아래에 일정량의 픽셀을 시작하는 방법을 알아낼 수 없다는 것입니다. 대신 전화가 회전 될 때 머리글 레이블과 충돌하지만 설정 단추는 정확히 어디에 머물러 있는지 해야한다. 내가 header.x와 header.y 내 scrollview의 위치를 ​​설정했는데 작동하지 않는 것, 그리고 내가 게시 한 예제는 내가 할 수있는 가장 가까운 것입니다 – Indeciski

+0

@ Indeciski 핑 – KeyWeeUsr

+0

BoxLayout에 넣는 것은 작동하는 것 같았다 잘. FloatLayout을 사용하는 한, 단추를 만든 다음 전화를 돌리면 찌그러 지거나 어색해 보입니다. 이것은 RelativeLayout을 사용하여 고정 된 것으로, FloatLayout과 같은 역할을한다고 말합니다. 즉, 자식 위젯이 레이아웃을 기준으로 배치된다는 점만 빼고, 어떤 문서를보아야하는지 알려줄 수 있습니까? 대안으로 체크 아웃 할 수 있습니다. 어떤 것이 나를 위해 더 잘 돌아가는지 보아라. 어쨌든 귀하의 도움과 자세한 설명에 많은 감사드립니다! – Indeciski