2016-11-26 66 views
1

當我使用kivy構建應用程序時,我可以將所需的所有東西都放到需要的位置,但是當我將屏幕從縱向旋轉到橫向時,我的小部件開始相互碰撞。什麼是防止這種情況發生的好方法?使用python/kivy處理窗口小部件放置以解釋屏幕旋轉的好方法是什麼?

在附加的例子中,我能夠將設置按鈕的位置綁定到我的標題標籤小部件,但是我沒有成功讓我的scrollview綁定到它,所以當它旋轉時它保持X空間距離標籤的底部。

的Python:

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' 

圖片:portraitlandscape

謝謝!

回答

0

編輯:我誤解了這個問題,我以爲你不滿意Image。在ScrollView的情況下,問題不是ScrollView本身,因爲它使用相對位置和大小。

的問題是Label(標題),它已高度設定爲絕對數即50稠密的像素。這意味着無論你有什麼屏幕或者你是否設置了其他尺寸,這個小部件將有50個像素corrected與屏幕的dpi。

在現實中,這意味着,如果你的屏幕達到400x100分辨率,你Label將屏幕的一半,ScrollView將放在最重要的是(最有可能的,你將不會看到Label然後)。

要解決這個問題,你有兩個選擇。如果你想單獨玩FloatLayout,你需要使用正確定位/尺寸,即相對並確保小部件不重疊。

否則剛落小部件BoxLayout或管理自身這樣的事情類似的其他佈局:

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

或不同的一點(和更好看):

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

和in 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 ping – KeyWeeUsr

+0

放入BoxLayout似乎工作正常好。至於使用FloatLayout,我注意到,如果你創建一個按鈕,然後旋轉手機,它往往會擠壓,看起來尷尬。這是通過使用RelativeLayout來解決的,它說它像FloatLayout一樣起作用,除了它的子部件相對於佈局定位,或者你可以指向我應該查看的文檔,所以我可以檢查它作爲替代方案看看哪個更適合我? 無論如何,非常感謝您的幫助和詳細解釋! – Indeciski

相關問題