ウェブサイト検索

LinuxでPyGObjectを使用してGUIアプリケーションを作成する方法


グラフィカルユーザーインターフェース(GUI)アプリケーションを作成することは、アイデアを形にし、プログラムをよりユーザーフレンドリーにする素晴らしい方法です。

PyGObjectは、開発者がGTK(GIMPツールキット)フレームワークを使用してLinuxデスクトップ上でGUIアプリケーションを作成できるPythonライブラリです。GTKはLinux環境で広く使用されており、Gedit、GNOME端末など、多くの人気デスクトップアプリケーションを支えています。

この記事では、PyGObjectを使用してLinuxデスクトップ環境でGUIアプリケーションを作成する方法を探ります。まずPyGObjectとは何か、どうやってインストールするのかを理解し、その後、シンプルなGUIアプリケーションの構築に進みます。

ステップ1: LinuxにPythonとGTKをインストールする

PyGObjectを使用するにはPythonがインストールされている必要がありますが、今日のほとんどのLinuxディストリビューションにはPythonがプリインストールされています。ただし、次のコマンドを実行することで確認できます:

python3 --version

Python 3.12.3

Python がインストールされていない場合は、特定の Linux ディストリビューションに適した次のコマンドを使用してインストールできます。

sudo apt install python3       [On Debian, Ubuntu and Mint]
sudo dnf install python3       [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apk add python3           [On Alpine Linux]
sudo pacman -S python          [On Arch Linux]
sudo zypper install python3    [On OpenSUSE]    

次に、Python用のPyGObjectバインディングとGTK開発ライブラリをインストールする必要があります。

sudo apt install python3-gi gir1.2-gtk-3.0    [On Debian, Ubuntu and Mint]
sudo dnf install python3-gobject gtk3         [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apk add py3-gobject gtk+3                [On Alpine Linux]
sudo pacman -S python-gobject gtk3            [On Arch Linux]
sudo zypper install python3-gobject gtk3      [On OpenSUSE] 

ステップ2: LinuxにPyGObjectをインストールする

PythonとGTK開発ライブラリがインストールされたら、特定のLinuxディストリビューションに適した以下のコマンドを使用してPyGObjectをインストールできます。

sudo apt install python3-gi           [On Debian, Ubuntu and Mint]
sudo dnf install pygobject3           [On RHEL/CentOS/Fedora and Rocky/AlmaLinux]
sudo apk add py3-gobject              [On Alpine Linux]
sudo pacman -S python-gobject         [On Arch Linux]
sudo zypper install python3-gobject   [On OpenSUSE]    

インストールが完了したら、PyGObjectとGTKを使用してGUIアプリケーションの開発を始める準備が整いました。

Linuxで最初のPyGObject GUIアプリケーションを作成する

さあ、ウィンドウにボタンを表示するシンプルなPyGObjectアプリケーションを作りましょう。ボタンがクリックされると、「こんにちは、世界!」というメッセージが表示されます。

app.py という名前のPythonファイルを作成し、私たちのPyGObjectアプリケーションの基本構造を書き始めましょう。

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

class MyApp(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Hello World App")
        self.set_size_request(300, 100)

        # Creating a button and adding it to the window
        button = Gtk.Button(label="Click Me")
        button.connect("clicked", self.on_button_clicked)
        self.add(button)

    def on_button_clicked(self, widget):
        print("Hello, World!")

Initialize the application
app = MyApp()
app.connect("destroy", Gtk.main_quit)  # Close the app when window is closed
app.show_all()
Gtk.main()

コードの説明:

  • 最初の2行は、必要なPyGObjectモジュールをインポートします。使用したいGTKのバージョン(この場合は3.0)を指定します。
  • MyAppクラスは、アプリケーションのメインウィンドウを表すGtk.Windowから継承されます。
  • Gtk.Buttonを使用してボタンを作成し、ボタンのラベルは「Click Me」に設定します。また、ボタンの「clicked」信号をon_button_clickedメソッドに接続し、ボタンがクリックされると「Hello, World!」と表示します。
  • アプリケーションのメインループは、Gtk.main()を呼び出すことで開始されます。このループは、イベント(クリックなど)を待機し、アプリケーションを適切に更新します。

アプリケーションを実行するには、app.pyファイルを保存したディレクトリに移動し、次のコマンドを実行してください:

python3 app.py

「クリックして下さい」と書かれたボタンがあるウィンドウが表示されます。ボタンをクリックすると、「こんにちは、世界!」と端末に印刷されます。

PyGObjectアプリケーションに機能を追加する

では、より多くのウィジェットとインタラクティブな機能を追加して、アプリケーションを拡張しましょう。

1. ラベルを追加する

ウィンドウにメッセージを表示するために、端末に印刷するのではなく、Gtk.Labelを追加することでアプリケーションを強化できます。

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

class MyApp(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Enhanced GUI App")
        self.set_size_request(400, 200)

        # Create a vertical box layout
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
        self.add(vbox)

        # Create a label
        self.label = Gtk.Label(label="Press the button to see a message")
        vbox.pack_start(self.label, True, True, 0)

        # Create a button
        button = Gtk.Button(label="Click Me")
        button.connect("clicked", self.on_button_clicked)
        vbox.pack_start(button, True, True, 0)

    def on_button_clicked(self, widget):
        self.label.set_text("Hello, World!")

Initialize the application
app = MyApp()
app.connect("destroy", Gtk.main_quit)
app.show_all()
Gtk.main()

変更の説明:

  • 私たちはGtk.Boxを使ってウィジェットを垂直に整理しました。これにより、ラベルとボタンを順に配置するのが容易になります。
  • この Gtk.Label ウィジェットは、ウィンドウ内にメッセージを表示するために追加されます。
  • ターミナルに印刷する代わりに、on_button_clicked関数はラベルのテキストを更新するようになりました。

2. ユーザー入力のためのエントリーフィールドの追加

次に、ユーザー入力を許可するために Gtk.Entry ウィジェットを追加しましょう。これにより、ユーザーが自分の名前を入力し、ボタンをクリックして個別の挨拶を表示するシンプルなアプリケーションを作成できるようになります。

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk

class MyApp(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="User Input App")
        self.set_size_request(400, 200)

        # Create a vertical box layout
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
        self.add(vbox)

        # Create an Entry widget for user input
        self.entry = Gtk.Entry()
        self.entry.set_placeholder_text("Enter your name")
        vbox.pack_start(self.entry, True, True, 0)

        # Create a button
        button = Gtk.Button(label="Submit")
        button.connect("clicked", self.on_button_clicked)
        vbox.pack_start(button, True, True, 0)

        # Create a label to display the greeting
        self.label = Gtk.Label(label="")
        vbox.pack_start(self.label, True, True, 0)

    def on_button_clicked(self, widget):
        name = self.entry.get_text()
        if name:
            self.label.set_text(f"Hello, {name}!")
        else:
            self.label.set_text("Please enter your name.")

Initialize the application
app = MyApp()
app.connect("destroy", Gtk.main_quit)
app.show_all()
Gtk.main()

コードの説明:

  • Gtk.Entryは、ユーザーが自分の名前を入力できる入力フィールドです。
  • set_placeholder_text メソッドは、ユーザーが何かを入力するまで、エントリーボックス内にヒントを表示します。
  • ボタンをクリックした後、入力された名前はget_text()を使用して取得され、ラベルにパーソナライズされた挨拶として表示されます。

3. CSSでアプリケーションをスタイリングする

PyGObjectを使用すると、style.cssというCSSファイルを使ってアプリケーションウィジェットにカスタムスタイルを適用できます。

window {
    background-color: #f0f0f0;
}

button {
    background-color: #4CAF50;
    color: white;
    border-radius: 5px;
    padding: 10px;
}

label {
    font-size: 16px;
    color: #333;
}

さて、Pythonコードを修正してこのCSSファイルを読み込み、適用するには:

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk

class MyApp(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Styled GUI App")
        self.set_size_request(400, 200)

        # Load CSS
        css_provider = Gtk.CssProvider()
        css_provider.load_from_path("style.css")
        screen = Gdk.Screen.get_default()
        style_context = Gtk.StyleContext()
        style_context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER)

        # Create a vertical box layout
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10)
        self.add(vbox)

        # Create an Entry widget for user input
        self.entry = Gtk.Entry()
        self.entry.set_placeholder_text("Enter your name")
        vbox.pack_start(self.entry, True, True, 0)

        # Create a button
        button = Gtk.Button(label="Submit")
        button.connect("clicked", self.on_button_clicked)
        vbox.pack_start(button, True, True, 0)

        # Create a label to display the greeting
        self.label = Gtk.Label(label="")
        vbox.pack_start(self.label, True, True, 0)

    def on_button_clicked(self, widget):
        name = self.entry.get_text()
        if name:
            self.label.set_text(f"Hello, {name}!")
        else:
            self.label.set_text("Please enter your name.")

Initialize the application
app = MyApp()
app.connect("destroy", Gtk.main_quit)
app.show_all()
Gtk.main()

CSS変更の説明:

  • ボタンは緑の背景があり、ラベルはカスタムフォントサイズと色を持っています。
  • ボタンの境界は現代的な見た目のために丸みを帯びています。

結論

PyGObject は、Pythonを使用してLinuxデスクトップ上でGUIアプリケーションを作成するための強力なツールです。Pythonの柔軟性とシンプルさを活かし、GTKの豊富な機能を組み合わせることで、開発者は機能が豊かで視覚的に魅力的なアプリケーションを作成することができます。

このガイドでは、PyGObjectの基本的な設定、シンプルなウィンドウの作成、ボタンクリックの処理、ユーザー入力の追加、さらにはカスタムCSSスタイルの適用について説明しました。

これらの例を拡張して、ファイルマネージャー、メディアプレーヤー、さらにはプロフェッショナルグレードのソフトウェアなど、より複雑なアプリケーションを構築することができます。PyGObjectとGTKを使えば、デスクトップアプリケーションの作成における可能性はほぼ無限大です!

関連記事: