为什么Kivy的布局都没有按预期工作?

时间:2015-04-12 06:06:18

标签: python kivy

以下是我要完成的内容,应该很简单:标签中的标题文字,其下方列有一些垂直按钮,并且向右嵌套

初审:

#:kivy 1.9.0


<SubjectButton@Button>:

  size_hint: None, None
  size: 40, 160

BoxLayout:

  orientation: "vertical"

  Label:
    text: "Choose Subject:"
    font_size: "16sp"
    bold: True
    halign: "left"


  BoxLayout:

    orientation: "vertical"
    padding_horizontal: 20

    SubjectButton:
       text: "Subject 1"

    SubjectButton:
      text: "Subject 2"

    SubjectButton:
      text: "Subject 3"

    SubjectButton:
      text: "Subject 4"

结果: what's that supposed to mean?

第二次审判:

#:kivy 1.9.0

#: set sb_width 120
#: set sb_height 40
#: set sb_margin_left 20

<SubjectButton@Button>:

size_hint: None, None
height: sb_height
width: sb_width


RelativeLayout:

Label:
    text: "Choose Subject:"
    font_size: "16sp"
    bold: True
    halign: "left"
    pos: 0, root.height - 5

SubjectButton:
    text: "Subject 1"
    pos: sb_margin_left, root.height - sb_height

SubjectButton:
    text: "Subject 2"
    pos: sb_margin_left, root.height - 2 * sb_height

SubjectButton:
    text: "Subject 3"
    pos: sb_margin_left, root.height - 3 * sb_height

SubjectButton:
    text: "Subject 4"
    pos: sb_margin_left, root.height - 4 * sb_height

结果:

Where's my label

标签不见了!。

首先让我说布局从左上角开始,在左下角显式定位的想法是愚蠢的(来自PySide)。这应该如何运作?。

这并不是说AnchorLayout实际上不是布局而是对齐工具。它不会影响一个孩子。

我在这里缺少什么?。

1 个答案:

答案 0 :(得分:0)

  

初审:

这里的问题是您手动设置按钮高度并使它们占窗口高度的1/4。你所看到的是他们因为这个而溢出BoxLayout高度,显然是从顶部开始。你通常不想直接设置手动高度,但让BoxLayout设置大小,以便它适应窗口大小的变化。

我不确定你究竟想要做什么,但这里有一个使用嵌套boxlayouts来解决明显问题的例子:

<SubjectButton@Button>:                                                                                                                            
    # size rules deleted                                                                                                                           

BoxLayout:                                                                                                                                         

    orientation: "vertical"                                                                                                                        

    Label:                                                                                                                                         
        text: "Choose Subject:"                                                                                                                    
        font_size: "16sp"                                                                                                                          
        bold: True                                                                                                                                 
        halign: "left"                                                                                                                             
        valign: 'middle'                                                                                                                           
        text_size: self.size                                                                                                                       


    BoxLayout:                                                                                                                                     
        Widget:                                                                                                                                    
            size_hint_x: None                                                                                                                      
            width: 10                                                                                                                              
        BoxLayout:                                                                                                                                 

            orientation: "vertical"                                                                                                                
            padding_horizontal: 20                                                                                                                 

            SubjectButton:                                                                                                                         
                text: "Subject 1"                                                                                                                  

            SubjectButton:                                                                                                                         
                text: "Subject 2"                                                                                                                  

            SubjectButton:                                                                                                                         
                text: "Subject 3"                                                                                                                  

            SubjectButton:                                                                                                                         
                text: "Subject 4"                                                                                                                  
        Label:                                                                                                                                     
            text: 'free space'              

请注意,我还在Label中设置了text_size: self.size,以便您的对齐生效。我还添加了垂直对齐。

我在Widget垫片中加入了间距。可能填充参数也可以做同样的事情,但我没有检查它的api。

  

二审:   标签不见了!。

它没有消失,您只需将其y位置设置为屏幕顶部下方5个像素,这样您就无法看到文字了。您可以通过添加以下内容来查看其确实位置以下是其kv规则,这对于查看明显缺少小部件的位置非常有用:

    canvas: 
        Color: 
            rgba: 1, 0, 0, 1 
        Rectangle: 
            pos: self.pos 
            size: self.size 

无论如何,使用RelativeLayout是一个坏主意,使用上面的嵌套布局会更好。

  

首先让我说布局从左上角开始,在左下角显式定位的想法是愚蠢的(来自PySide)。这应该如何运作?。

我认为它在某种意义上是不一致的,但说实话,我从来没有注意到它是一个问题。它会引起你一个特定的问题吗?

  

更不用说AnchorLayout实际上不是布局而是对齐工具。它并不影响一个孩子。

不确定你在这里的意思...... AnchorLayout就像其他任何布局一样布置它的孩子。