Kivy 简明教程

Kivy - Stack Layout

StackLayout 类的对象充当一个部件容器,在其中子部件放置在彼此旁边,水平或垂直方向,取决于方向属性。当布局尺寸能容纳时,将容纳许多部件。每个部件的大小可以不同。

让我们假设 StackLayout 对象配置为从左到右和从上到下容纳部件。水平放置 “x” 个部件后,如果无法将 “x+1” 部件放入同一行,它将被推到下一行,依此类推,直至布局的高度用尽。

StackLayout 类在 “kivy.uix.stacklayout” 模块中定义。

from kivy.uix.stacklayout import StackLayout
stack = StackLayout(**kwargs)

StackLayout 对象通过定义以下属性来定制 –

  1. minimum_width - 自动计算包含所有子项所需的最小宽度。它是一个 NumericProperty,默认为 0。它是只读的。

  2. minimum_height - 自动计算包含所有子项所需的最小高度。它是一个 NumericProperty,默认为 0。它是只读的。

  3. minimum_height - 自动计算包含所有子项所需的最小高度。minimum_height 是一个 NumericProperty,默认为 0。它是只读的。

  4. minimum_size - 自动计算包含所有子项所需的最小大小。minimum_size 是 (minimum_width, minimum_height) 属性的 ReferenceListProperty。它是只读的。

  5. minimum_width - 自动计算包含所有子项所需的最小宽度。minimum_width 是一个 NumericProperty,默认为 0。它是只读的。

  6. orientation - 布局的方向。此属性确定部件在网格中连续单元格中的放置方式。orientation 是一个 OptionProperty。其有效值如下: - ‘lr-tb’ - 从左到右和从上到下顺序填充单元格。‘tb-lr’ - 从上到下和从左到右顺序填充单元格。‘rl-tb’ - 从右到左和从上到下顺序填充单元格。‘tb-rl’ - 从上到下和从右到左顺序填充单元格。‘lr-bt’ - 从左到右和从下到上顺序填充单元格。‘bt-lr’ - 从下到上和从左到右顺序填充单元格。‘rl-bt’ - 从右到左和从下到上顺序填充单元格。‘bt-rl’ - 从下到上和从右到左顺序填充单元格。

orientation 属性的默认值为 ‘lr-tb’。

Example

以下程序演示了 StackLayout 的使用。如前所述,默认方向为 ‘lr-tb’。从左到右然后从上到下顺序放置宽度逐渐增加但高度相同的按钮。

当下一个按钮无法放在当前行中时,它将被向下推。每个按钮标题都是从 1 到 50 之间随机生成的唯一数字。

from kivy.app import App
from kivy.uix.button import Button
from kivy.config import Config
from kivy.uix.stacklayout import StackLayout
import random

Config.set('graphics', 'width', '720')
Config.set('graphics', 'height', '400')
Config.set('graphics', 'resizable', '1')

class StackApp(App):
   def build(self):
      stack = StackLayout()
      width=100
      nums=[]
      for i in range(1, 25):
         while True:
            num = random.randint(1,25)
            if num not in nums:
               nums.append(num)
               btn = Button(
                  text = str(num), width=width,
                  size_hint=(None, 0.15)
               )
               width = width+num*2
               stack.add_widget(btn)
               break
      return stack
StackApp().run()

Output

它将生成一个如下所示的堆栈布局 –

kivy stack layout

如果你尝试调整窗口大小,按钮的位置将相应改变,并且它们要么容纳在上方一行,要么向下推。

让我们将布局的方向更改为 ‘tb-lr’。

stack = StackLayout(orientation='tb-lr')

再次运行程序并查看更改 –

kivy change orientation

再次,将 orientation 属性更改为 'rl-bt' 并运行程序 −

stack = StackLayout(orientation='rl-bt')

此布局从右到左、从下到右开始填充按钮。因此,生成的窗口如下所示 −

kivy stack layout right to left