Gtk.Boxの使用
Gtk.Boxは、Gtk.LabelやGtk.ButtonなどのWidgetを垂直もしくは水平に並べて載せるのに使用するものであり、Gtk.ApplicationWidngowなどに複数のWidgetを載せるのに使用するWidgetです。
今回は、①外観をプロパティで指定したGtk.Boxの作成方法と、②Gtk.Boxに子(Widget:サンプルではGtk.Label)を追加する方法について紹介します。
※ 外観の指定は、Propertiesの他にメソッドでも行えます。
今回紹介する内容
・ 外観をプロパティで指定したGtk.Boxを作成する
・ Gtk.Boxに子を追加する
Gtk.Boxの作成
外観をプロパティで設定したGtk.Boxを作成する
Gtk.Boxは、Gtk.Box()と記入することで作成できます。Gtk.Boxのプロパティは、Gtk.Box()の中に以下のように「プロパティ名=値」という形で,(カンマ)区切りで記入することで、設定します。
box = Gtk.Box(
width_request=300, height_request=80,
margin_top=20, margin_bottom=20,
margin_start=20, margin_end=20,
spacing=30,
hexpand=True, vexpand=True,
homogeneous=True)
self.set_child(box)
Gtk.Box用のプロパティは、以下のリンク(PyGObject API Reference)で確認できます。
リンク先のページより、Gtk.Boxには、Gtk.Boxのプロパティ3つ(baseline_position, homogeneous, spacing)の他に、Gtk.Boxが継承しているクラス(Gtk.Widget, Gtk.Accessible, Gtk.Orientable)のプロパティ(Properties)を使用できることが確認できます。
※ リンク先のHPでは、baseline-positionと記述していますがpythonではbaselin_positionというように、(-)ハイフンを(_)アンダーバーに変更して使用します。他のプロパティも同じです。
Gtk.Box用の主なプロパティ
Gtk.Boxに使用可能な主なプロパティをまとめると、以下のようになります。
名前 | 型 | 内容 |
---|---|---|
homogeneous | bool | 子をすべて同じサイズにするかどうか 既定値:False |
spacing | int | 子同士の間隔 既定値:0 |
名前 | 型 | 内容 |
---|---|---|
halign | Gtk.Align | Widgetに余分な水平方向のスペースがある場合に、 そのスペースを分配する方法を指定する。 既定値:Gtk.Align.FILL |
height-request | int | Widgetの高さを指定する。 既定値: -1 (指定無し) |
hexpand | bool | Widgetを水平方向に拡張するかどうか 既定値:False |
margin_bottom | int | Widgetの下側の余白。 既定値:0 |
margin_end | int | Widgetの右側の余白。 既定値:0 |
margin_start | int | Widgetの左側の余白。 既定値:0 |
margin_top | int | Widgetの上側の余白。 既定値:0 |
sensitive | bool | Widgetが入力に応答するかどうか 既定値:True |
valign | bool | Widgetに余分な垂直方向のスペースがある場合に、 そのスペースを分配する方法を指定する。 |
vexpand | bool | Widgetを垂直方向に拡張するかどうか 既定値:False |
visible | bool | Widgetを表示するかどうか 既定値:True |
width_request | int | Widgetの幅を指定する。 既定値: -1 (指定無し) |
名前 | 型 | 内容 |
---|---|---|
orientation | Gtk.Orientation | Widgetを並べる方向を指定する。 Gtk.Orientation.HORIZONTAL : 水平方向(既定値) Gtk.Orientation .VERTICAL : 垂直方向 |
Gtk.BoxにWidgetを載せる
Gtk.Boxへの子(Widget)の追加や削除、子の位置の移動には、以下のメソッドを使用します。
メソッド | 内容 |
---|---|
append(child) | childを最後の子として追加する。 |
insert_child_after(child, sibling) | sibling(すでに載せた子(widget))の後ろに、childを挿入する。 siblingがNoneの場合は、最初の位置にchildを挿入する。 |
prepend(child) | childを最初の子として追加する。 |
remove(child) | 子であるchildを削除する。 |
reorder_child_after(child, sibling) | 子であるchildの配置をsiblingの後の位置に移動する。 |
append()を使用したGtk.BoxへのWidgetの追加
以下は、box(Gtk.Box)にlabel1、label2、label3(Gtk.Label)を載せるプログラム部分を抜粋したものです。appendは、(Gtk.Box名).append(childe名)の形で使用するものであり、label1、label2、label3の順に載せる指示を出すと、図のように左から載せた順番の並びに配置されます。(Gtk.Orientationを指定しない場合)
label1 = Gtk.Label(label='Label1')
label2 = Gtk.Label(label='Label2')
label3 = Gtk.Label(label='Label3')
box.append(label1)
box.append(label2)
box.append(label3)
サンプルプログラム
以下のサンプルプログラムは、下図のように外観をプロパティで指定したGtk.Boxに、Gtk.Labelを3つ載せたものが表示されるものです。Gtk.Box及びGtk.Labelに関わる行の内容は、プログラムの下に記入しています。
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk
APPID = 'com.github.taniyoshima.g4_fblog_box'
class Gtk4TestTest(Gtk.Window):
def __init__(self, app):
Gtk.Window.__init__(
self, application=app, title='Gtk.Box Test')
box = Gtk.Box(
width_request=300, height_request=80,
margin_top=20, margin_bottom=20,
margin_start=20, margin_end=20,
spacing=30,
hexpand=True, vexpand=True,
homogeneous=True)
self.set_child(box)
label1 = Gtk.Label(label='Label1')
label2 = Gtk.Label(label='Label2')
label3 = Gtk.Label(label='Label3')
box.append(label1)
box.append(label2)
box.append(label3)
class Gtk4TestApp(Gtk.Application):
def __init__(self):
Gtk.Application.__init__(self, application_id=APPID)
def do_activate(self):
window = Gtk4TestTest(self)
window.present()
def main():
app = Gtk4TestApp()
app.run()
if __name__ == '__main__':
main()
Gtk.Boxの設定は、15行目から21行目のGtk.Boxを定義するところで、プロパティにより以下の設定をしました。
- width_request=300, height_request=80,(16行目) ⇨ 要求する幅及び高さの指定
- margin_top=20, margin_bottom=20,…(17、18行目) ⇨ Gtk.Box周辺の余白をどれだけ設けるか
- spacing=30,(19行目) ⇨ 子Widget同士の隙間をどれだけ設けるか
- hexpand=True, vexpand=True,(20行目) ⇨ 余白がある時に水平方向、垂直方向に拡張するか
- homogeneous=True(21行目) ⇨ 子Widgetを等間隔に配置するか
Gtk.BoxへのGtk.Labelの追加は、24行目から30行目で行っています。24行目から26行目までで定義したGtk.Labelを28行目から30行目までで順番にGtk.Boxに載せています。フォルトは、Gtk.Orientation.HORIZONTALでして、水平方向に載せる場合は指定する必要がありませんが、垂直方向に積む場合は、下のようにorientation=Gtk.Orientation.VERTICALを記入します。