2016-11-26 63 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

相关问题