[Python,Gtk4] Gtk.Boxの使用について① プロパティによる設定

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)で確認できます。

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に使用可能な主なプロパティをまとめると、以下のようになります。

名前 内容
homogeneousbool子をすべて同じサイズにするかどうか      
既定値:False
spacingint子同士の間隔
既定値:0
Gtk.Boxのプロパティ
名前 内容
halignGtk.AlignWidgetに余分な水平方向のスペースがある場合に、
そのスペースを分配する方法を指定する。
既定値:Gtk.Align.FILL
height-requestintWidgetの高さを指定する。
既定値: -1 (指定無し)
hexpandboolWidgetを水平方向に拡張するかどうか
既定値:False
margin_bottomintWidgetの下側の余白。
既定値:0
margin_endintWidgetの右側の余白。
既定値:0
margin_startintWidgetの左側の余白。
既定値:0
margin_topintWidgetの上側の余白。
既定値:0
sensitiveboolWidgetが入力に応答するかどうか
既定値:True
valignboolWidgetに余分な垂直方向のスペースがある場合に、
そのスペースを分配する方法を指定する。
vexpandboolWidgetを垂直方向に拡張するかどうか
既定値:False
visibleboolWidgetを表示するかどうか
既定値:True
width_requestintWidgetの幅を指定する。
既定値: -1 (指定無し)
Gtk.Windowのプロパティ
名前 内容
orientationGtk.Orientation Widgetを並べる方向を指定する。
Gtk.Orientation.HORIZONTAL : 水平方向(既定値)
Gtk.Orientation .VERTICAL : 垂直方向
Gtk.Orientableのプロパティ

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の後の位置に移動する。
Gtk.Boxの子の追加、削除関係のメソッド

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)
Gtk4で作成したGtk.Boxの画像、ラベルを3つのせている。

サンプルプログラム

 以下のサンプルプログラムは、下図のように外観をプロパティで指定したGtk.Boxに、Gtk.Labelを3つ載せたものが表示されるものです。Gtk.Box及びGtk.Labelに関わる行の内容は、プログラムの下に記入しています。

Gtk4で作成したGtk.Boxの画像、ラベルを3つのせている。
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を記入します。

タイトルとURLをコピーしました