【问题标题】:Why none of Kivy's layouts work as expected?为什么 Kivy 的布局都没有按预期工作?
【发布时间】:2015-04-12 21:20:21
【问题描述】:

这是我想要完成的,应该很简单:标签中的标题文本,下面列出了一些垂直按钮并嵌套在右侧

一审:

#: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"

结果:

二审:

#: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

结果:

标签不见了!

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

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

我在这里错过了什么?

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    一审:

    您的问题是您手动设置按钮高度并将它们设置为窗口高度的 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 像任何其他布局一样布置其子级。

    【讨论】:

    • 感谢您介绍空间隔小部件的想法。我最终得到了第一个解决方案的变体。根据我的经验,AnchorLayout 是单个小部件的对齐工具,而您在此处的回答 stackoverflow.com/questions/25337720/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-04
    • 2021-01-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多