PyGObject:在 Linux 上創建 Python GUI 應用程序的指南

創建圖形使用者介面(GUI)應用程序是將您的想法变为现实并使您的程序更加用户友好的绝佳方式。

PyGObject是一個Python庫,允許開發者使用GTKGIMP Toolkit)框架在Linux桌面创建GUI應用程序。GTK在Linux環境中广受欢迎,許多流行的桌面應用程序GeditGNOME终端等均使用GTK作为动力。

在本文中,我们将探讨如何在Linux桌面环境下使用PyGObject创建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]    

现在,您需要安装PyGObjectPython的绑定,以及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()

程式碼解釋:

  • 前兩行導入了必要的 PyGObject 模塊。我們指定了我們想要使用的 GTK 版本(在這個案例中是 3.0)。
  • <code>MyApp</code>類別承襲自<code>Gtk.Window</code>,這代表應用程序的主窗口。
  • 我們使用<code>Gtk.Button</code>創建一個按鈕,按鈕的標籤設定為“<diy15>點我</diy15>“。我們也連接到按鈕的“<diy16>clicked</diy16>”信號到<code>on_button_clicked</code>方法,當點擊時會印出“<diy17>你好,世界!</diy17>”。
  • 通過呼叫<code>Gtk.main()</code>來開始應用程式的主要循環。這個循環等待事件(如點擊)並根據需求更新應用程序。

前往您儲存 app.py 檔案的目錄,並執行以下命令:

python3 app.py

將會出現一個視窗,並有一個標籤為“點我”的按鈕。當您點擊該按鈕時,“你好,世界!”將會被印在終端機上。

PyGObject GUI Application

為您的 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 函數不再打印到終端機,而是更新標籤的文本。
PyGObject GUI Application with Label

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()` 方法取回輸入的名字,並將其顯示在標籤中作為個人化的問候語。
PyGObject GUI Application with User Input

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 更改說明:

  • 按鈕 background 是綠色,標籤有自訂字體大小及顏色。
  • 按鈕邊框為圓角,营造現代化的視覺效果。
PyGObject GUI Application with CSS Styling
結論

PyGObject 是一種強大的工具,用於在 Linux 桌面端使用 Python 創建 GUI 應用程式。通過 leveraging Python 的靈活性和簡潔性,以及 GTK 的豐富功能,開發者可以創建功能豐富且視覺上引人瞩目的應用程式。

在這個指南中,我們涵蓋了設定 PyGObject 的基本知識、創建簡單視窗、處理按鈕點擊、添加使用者輸入,甚至是應用自訂 CSS 風格。

您可以將這些示例擴展以建立更複雜的應用程式,例如 檔案管理器媒體播放器,甚至是專業级别的軟體。有了 PyGObjectGTK,創建桌面應用程式的可能性几乎是無窮無盡!

Source:
https://www.tecmint.com/pygobject-create-python-gui-application-linux/