BoxLayoutについて
KivyのBoxLayoutは子を載せるレイアウトクラスの一つであり、子を垂直もしくは水平に並べて配置します。BoxLayoutは、kvファイルに記入した順番に配置されるため完成した場合の配置をイメージしやすく、複数のBoxLayoutを使用することで柔軟にレイアウトを変更でる使い易いレイアウトです。
今回は、BoxLayoutをKv languageで記入する方法とBoxLayoutの装飾関係について紹介します。
![](https://tannipat.blog/wp-content/uploads/2023/10/kit_test_boxlayout.webp)
今回紹介する内容
・ Kv languageでBoxLayoutを使用する。
・ BoxLayoutに載せるWidget(子)を並べる方向を指定する。
・ BoxLayoutの子同士の間隔を指定する
・ BoxLayoutの子のまわりの隙間を指定する。
・ BoxLayoutの背景色を指定する。
BoxLayoutの設定
Kv languageでBoxLayoutを使用する。
Kv languageでBoxLayoutを定義する場合、まずBoxLayout:を記入してその下に以下のように、BoxLayoutのプロパティやイベントの設定と子(Widget)を記入します。
<BoxLayoutTestWidget>:
BoxLayout:
# BoxLayoutのプロパティやイベントを記入
size: root.size
orientation: 'vertical'
spacing: 20
padding: 20
canvas.before:
Color:
rgba: 0.7, 0.7, 0.7, 1
Rectangle:
size: self.size
pos: self.pos
# 子(Widget)を記入
Button:
id: button1
text: 'Button1'
on_press: root.on_button_press(1)
BoxLayoutに載せるWidget(子)を並べる方向を指定する。
BoxLayoutに載せる子の並び方向は、プロパティorientationによって指定します。orientationの値は、水平方向:’horizontal’と垂直方向:’vertical’であり、デフォルトは’horizontal’です。
<BoxLayoutTestWidget>:
BoxLayout:
size: root.size
orientation: 'vertical'
BoxLayoutの子のまわりの隙間を指定する。
BoxLayoutとBoxLayoutに載せたWidgetとの間隔(ピクセル単位)は、paddingにより指定します。paddingの指定には、以下の記入方法があります。
①[ 左側の間隔, 上側の間隔, 右側の間隔, 下側の間隔 ]
②[ 水平方向(左側、右側)の間隔, 垂直方向(上側、下側) ]
③1つの値(左側、上側、右側、下側が同じ値)
BoxLayout:
size: root.size
orientation: 'vertical'
spacing: 20
padding: 20
BoxLayoutの子同士の間隔を指定する
BoxLayoutに載せたWidget同士の間隔(ピクセル単位)は、spacingで指定します
BoxLayout:
size: root.size
orientation: 'vertical'
spacing: 20
padding: 20
BoxLayoutの背景色を指定する
BoxLayoutの背景色は、kivy.graphics.Canvasのbeforeグループに対して、Colorで背景色(rgbaで指定する)、Rectangleで背景色の範囲(位置posとサイズsize)を指定します。
BoxLayout:
# 省略
canvas.before:
Color:
rgba: 0.7, 0.7, 0.7, 1
Rectangle:
size: self.size
pos: self.pos
サンプルプログラムのその他の内容
Kvファイルを指定する(load_fileの使用)
Kvファイルの指定には、①Kvファイル名をAppクラスの名前の一部(例:MyAppならばKvファイル名はmy.kv)にしておく方法(KvファイルとPythonファイルとを同じフォルダに保存しておく必要がある)と、②kivy.lang.builder.BuilderBaseのload_fileを使用してkvファイルを指定する方法があります。
②の方法の場合、kvファイルを別のフォルダに保管することが可能でありファイルの整理が容易になります。
from kivy.lang import Builder
Builder.load_file(os.path.dirname(__file__) + "/interface.kv")
ウィンドウのサイズを指定する
Kivyのウィンドウサイズは、kivy.config.Configのsetを使用してgraphicsのwidthとheightにより指定します。
from kivy.config import Config
Config.set('graphics', 'width', '450')
Config.set('graphics', 'height', '400')
kivy.config.Configで使用できる設定の一覧が、以下のサイトにあります。
Available configuration tokens
サンプルプログラム
下記の2つのファイルを同じフォルダに保存して、プログラムを実行すると下図のような画面が表示されます。表示されるButtonはBoxLayout内に配置したものであり、BoxLayoutのプロパティにより、余白部分の色、余白の幅、ボタン同士の間隔が設定されています。
![](https://tannipat.blog/wp-content/uploads/2023/10/kit_test_boxlayout.webp)
#:kivy 2.0
<BoxLayoutTestWidget>:
BoxLayout:
size: root.size
orientation: 'vertical'
spacing: 20
padding: 20
canvas.before:
Color:
rgba: 0.7, 0.7, 0.7, 1
Rectangle:
size: self.size
pos: self.pos
Button:
id: button1
text: 'Button1'
on_press: root.on_button_press(1)
Button:
id: button2
text: 'Button2'
on_press: root.on_button_press(2)
Button:
id: button3
text: 'Button3'
on_press: root.on_button_press(3)
Button:
id: button4
text: 'Button4'
on_press: root.on_button_press(4)
# -*- coding: utf-8 -*-
import os
import kivy
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder
from kivy.config import Config
kivy.require('2.2.0')
# 画面サイズの指定
Config.set('graphics', 'width', '450')
Config.set('graphics', 'height', '400')
# kvファイルの指定
Builder.load_file(os.path.dirname(__file__) + "/interface.kv")
class BoxLayoutTestWidget(Widget):
def __init__(self, **kwargs):
super(BoxLayoutTestWidget, self).__init__(**kwargs)
def on_button_press(self, num):
print(f'Button{num} is clicked')
class BoxLayoutTestApp(App):
def __init__(self, **kwargs):
super(BoxLayoutTestApp, self).__init__(**kwargs)
self.title = 'BoxLayout Test'
def build(self):
return BoxLayoutTestWidget()
if __name__ == '__main__':
app = BoxLayoutTestApp()
app.run()