Linux で PyGobject ツールを使用してさらに高度な GUI アプリケーションを作成する
グラフィカル ユーザー インターフェイス (GUI) アプリケーションは、現代のソフトウェア開発に不可欠な部分になっています。 GUI は、ユーザーがアプリケーションを操作するための、視覚的に魅力的で使いやすいインターフェイスを提供します。 Linux では、PyGObject は、GObject イントロスペクション ライブラリを使用して GUI アプリケーションを開発するための強力なツールです。 PyGObject は、GTK、GStreamer などの GObject ベースのライブラリのバインディングを提供する Python モジュールです。この記事では、Linux で PyGObject を使用して、より高度な GUI アプリケーションを作成する方法について説明します。
PyGObjectとは何ですか?
GObject は、C でオブジェクト指向ソフトウェアを作成するために GTK、GStreamer、およびその他のライブラリで使用される基本的なオブジェクト システムです。PyGObject を使用すると、開発者は GObject ベースのライブラリの機能を活用しながら、Python を使用して GUI アプリケーションを作成できます。
要件
PyGObject を使用して GUI アプリケーションの開発を開始する前に、いくつかの依存関係をインストールする必要があります。このチュートリアルでは、GTK ライブラリを使用して GUI アプリケーションを作成します。 GTK ライブラリをインストールするには、ターミナルで次のコマンドを実行します-
sudo apt-get install libgtk-3-dev
GTK ライブラリの Python バインディングを提供する PyGObject モジュールもインストールする必要があります。 PyGObjectをインストールするには、次のコマンドを実行します-
sudo apt-get install python3-gi
必要な依存関係をインストールしたら、PyGObject を使用して GUI アプリケーションの開発を開始できます。
単純な PyGObject アプリケーションの作成
まず、ウィンドウを表示する単純な PyGObject アプリケーションを作成しましょう。お気に入りのテキスト エディターを開き、simple_app.py という新しいファイルを作成します。このファイルに、次のコードを追加します-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="My Window")
win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
このコードを段階的に見てみましょう。まず gi モジュールをインポートし、GTK ライブラリのバージョン 3.0 が必要であることを指定します。次に、PyGObject を使用して GUI アプリケーションを作成するための主要なクラスと関数を提供する Gtk モジュールをインポートします。
次に、Gtk.Window クラスを継承する MyWindow という新しいクラスを作成します。 __init__ メソッドでは、親コンストラクターを呼び出し、ウィンドウのタイトルを「My Window」に設定します。
次に、MyWindow クラスのインスタンスを作成し、「destroy」信号を Gtk.main_quit 関数に接続します。この関数は、ユーザーがウィンドウを閉じるときに呼び出されます。最後に、show_all メソッドを使用してウィンドウを表示し、Gtk.main 関数を使用してメイン ループを開始します。
このアプリケーションを実行するには、ターミナルを開き、simple_app.py ファイルが含まれるディレクトリに移動します。次に、次のコマンドを実行します-
python3 simple_app.py
これにより、「My Window」というタイトルのウィンドウが開きます。
ウィンドウにウィジェットを追加する
単純な PyGObject アプリケーションを作成したので、ウィンドウにいくつかのウィジェットを追加しましょう。ウィジェットは GUI アプリケーションの構成要素であり、ボタン、ラベル、テキスト ボックスなどを含めることができます。
ウィンドウにラベルを追加しましょう。 simple_app.py ファイルの MyWindow クラスを次のように変更します-
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="My Window")
# Create a label widget
self.label = Gtk.Label()
# Add the label to the window
self.add(self.label)
__init__ メソッドでは、まず Gtk.Label クラスのインスタンスを作成し、それを self.label 属性に割り当てます。次に、Gtk.Window クラスの add メソッドを使用して、ラベル ウィジェットをウィンドウに追加します。 ここで、MyWindow クラスのインスタンスを作成してウィンドウを表示すると、ラベル ウィジェットがウィンドウの左上隅に表示されます。 次に、ラベルのテキストを「Hello, World!」に設定しましょう。そしてそれをウィンドウに追加します。 __init__ メソッドを次のように変更します-
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="My Window")
# Create a label
self.label = Gtk.Label()
self.label.set_text("Hello, World!")
self.add(self.label)
ラベルのテキストを「Hello, World!」に設定するコードを 2 行追加しました。そして、add メソッドを使用してウィンドウに追加します。
アプリケーションを実行すると、「Hello, World!」というラベルが付いたウィンドウが表示されるはずです。
ボタンの追加
クリックするとラベルのテキストを変更するボタンをウィンドウに追加してみましょう。 MyWindow クラスの __init__ メソッドを次のように変更します-
class MyWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="My Window")
# Create a label
self.label = Gtk.Label()
self.label.set_text("Hello, World!")
self.add(self.label)
# Create a button
self.button = Gtk.Button(label="Click me")
self.button.connect("clicked", self.on_button_clicked)
self.add(self.button)
def on_button_clicked(self, widget):
self.label.set_text("Button clicked")
新しい Gtk.Button ウィジェットを追加し、self.button インスタンス変数に割り当てました。また、ボタンの「クリック」信号を on_button_clicked という新しいメソッドに接続しました。このメソッドは、ボタンがクリックされたときに呼び出されます。
on_button_clicked メソッドでは、ラベルのテキストを「ボタンがクリックされました」に設定します。
アプリケーションを実行すると、「Hello, World!」というラベルが付いたウィンドウが表示されるはずです。そして「クリックしてください」というボタン。ボタンをクリックすると、ラベルのテキストが「ボタンがクリックされました」に変わります。
次に、PyGObject を使用して作成できる、より高度で複雑な GUI アプリケーションをいくつか見てみましょう。
電卓アプリケーションの作成
基本的な算術演算を実行する電卓アプリケーションを作成してみましょう。
まず、Gtk.Window クラスを継承する新しいクラス CalculatorWindow を定義します。このクラスは、アプリケーションのメイン ウィンドウを作成するために使用されます。
class CalculatorWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Calculator")
次に、ウィジェットをグリッド状の構造に配置するためのグリッド レイアウトを作成します。
# Create a grid
grid = Gtk.Grid()
self.add(grid)
計算結果を表示する Gtk.Label ウィジェットを作成します。
# Create the display label
self.display = Gtk.Label()
self.display.set_hexpand(True)
self.display.set_vexpand(True)
self.display.set_alignment(1, 0)
self.display.set_text("0")
grid.attach(self.display, 0, 0, 4, 1)
次に、電卓のボタンを作成します。各ボタンは Gtk.Button クラスを使用して作成され、対応する番号または演算子のラベルが付けられます。
# Create the buttons
button_7 = Gtk.Button(label="7")
button_8 = Gtk.Button(label="8")
button_9 = Gtk.Button(label="9")
button_divide = Gtk.Button(label="/")
button_4 = Gtk.Button(label="4")
button_5 = Gtk.Button(label="5")
button_6 = Gtk.Button(label="6")
button_multiply = Gtk.Button(label="*")
button_1 = Gtk.Button(label="1")
button_2 = Gtk.Button(label="2")
button_3 = Gtk.Button(label="3")
button_subtract = Gtk.Button(label="-")
button_0 = Gtk.Button(label="0")
button_decimal = Gtk.Button(label=".")
button_equal = Gtk.Button(label="=")
button_add = Gtk.Button(label="+")
各ボタンのクリック信号を on_button_clicked メソッドに接続します。このメソッドは、入力されている現在の式に対応する数値または演算子を追加します。
# Connect the button signals to the handlers
button_7.connect("clicked", self.on_button_clicked, "7")
button_8.connect("clicked", self.on_button_clicked, "8")
button_9.connect("clicked", self.on_button_clicked, "9")
button_divide.connect("clicked", self.on_button_clicked, "/")
button_4.connect("clicked", self.on_button_clicked, "4")
button_5.connect("clicked", self.on_button_clicked, "5")
button_6.connect("clicked", self.on_button_clicked, "6")
button_multiply.connect("clicked", self.on_button_clicked, "*")
button_1.connect("clicked", self.on_button_clicked, "1")
button_2.connect("clicked", self.on_button_clicked, "2")
button_3.connect("clicked", self.on_button_clicked, "3")
button_subtract.connect("clicked", self.on_button_clicked, "-")
button_0.connect("clicked", self.on_button_clicked, "0")
button_decimal.connect("clicked", self.on_button_clicked, ".")
button_equal.connect("clicked", self.on_equal_clicked)
button_add.connect("clicked", self.on_button_clicked, "+")
ボタンをグリッド レイアウトに追加し、4x4 グリッドに配置します。
# Add the buttons to the grid
grid.attach(button_7, 0, 1, 1, 1)
grid.attach(button_8, 1, 1, 1, 1)
grid.attach(button_9, 2, 1, 1, 1)
grid.attach(button_divide, 3, 1, 1, 1)
grid.attach(button_4, 0, 2, 1, 1)
grid.attach(button_5, 1, 2, 1, 1)
grid.attach(button_6, 2, 2, 1, 1)
grid.attach(button_multiply, 3, 2, 1, 1)
grid.attach(button_1, 0, 3, 1, 1)
grid.attach(button_2, 1, 3, 1, 1)
grid.attach(button_3, 2, 3, 1, 1)
grid.attach(button_subtract, 3, 3, 1, 1)
grid.attach(button_0, 0, 4, 1, 1)
grid.attach(button_decimal, 1, 4, 1, 1)
grid.attach(button_equal, 2, 4, 1, 1)
grid.attach(button_add, 3, 4, 1, 1)
各ボタンのクリック イベントを処理する on_button_clicked メソッドを定義します。このメソッドは、入力されている現在の式に対応する文字を追加します。
# Handler for the button click event
def on_button_clicked(self, widget, char):
self.expression += char
self.display.set_text(self.expression)
また、現在の式を評価し、結果をラベルに表示する on_equal_clicked メソッドも定義します。
# Handler for the equal button click event
def on_equal_clicked(self, widget):
try:
result = str(eval(self.expression))
self.display.set_text(result)
self.expression = result
except:
self.display.set_text("Error")
self.expression = ""
最後に、CalculatorWindow クラスのインスタンスを作成し、メイン ウィンドウを表示します。
if __name__ == "__main__":
win = CalculatorWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
これにより、GUI を備えた基本的な電卓アプリケーションが作成されます。さらに機能を追加したり、ウィジェットのレイアウトやデザインを変更したりして、さらにカスタマイズできます。
結論
PyGObject は、Linux で GUI アプリケーションを作成するための強力なツールです。これは、GTK+ の基礎となる C ライブラリである GObject ライブラリ用の Python API を提供します。 PyGObject を使用すると、開発者は Linux のデスクトップ環境用の複雑で洗練された GUI アプリケーションを簡単に作成できます。
この記事では、PyGObject の基本を説明し、このツールを使用して単純なテキスト エディターと電卓アプリケーションを作成する方法を説明しました。また、カスタム ウィジェットの作成やスタイル設定のための CSS の使用など、PyGObject のいくつかの高度な機能についても調査しました。
PyGObject は、Linux で GUI アプリケーションを作成するための幅広い可能性を提供します。開発者はツールの機能を活用して、ユーザー エクスペリエンスを向上させるリッチでインタラクティブなデスクトップ アプリケーションを構築できます。 Python のシンプルさと使いやすさを GObject ライブラリのパワーと柔軟性と組み合わせることで、PyGObject は Linux で高度な GUI アプリケーションを作成するための堅牢なソリューションを提供します。