Kivy - 堆叠布局



StackLayout 类的一个对象充当小部件容器,其中子小部件并排放置,水平或垂直方向取决于 orientation 属性。布局尺寸可以容纳尽可能多的部件。每个部件的尺寸可以是不同的。

让我们假设 StackLayout 对象被配置为从左到右、从上到下放置部件。“x”个部件水平放置后,如果无法在同一行放置部件“x+1”,则将其推到下一行,依此类推,直到布局高度耗尽。

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

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

通过定义以下属性来自定义 StackLayout 对象:

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

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

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

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

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

  • orientation - 布局的方向。此属性决定小部件如何在网格中的连续单元格中放置。orientation 是一个 OptionProperty。其有效值为:

    • 'lr-tb' - 单元格从左到右,从上到下填充。

    • 'tb-lr' - 单元格从上到下,从左到右填充。

    • 'rl-tb' - 单元格从右到左,从上到下填充。

    • 'tb-rl' - 单元格从上到下,从右到左填充。

    • 'lr-bt' - 单元格从左到右,从下到上填充。

    • 'bt-lr' - 单元格从下到上,从左到右填充。

    • 'rl-bt' - 单元格从右到左,从下到上填充。

    • 'bt-rl' - 单元格从下到上,从右到左填充。

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

示例

下面的程序演示了 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()

输出

它将生成如下所示的堆叠布局:

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
广告