使用PyGobject工具在Linux中建立更高階的GUI應用程式
圖形使用者介面 (GUI) 應用程式已成為現代軟體開發中不可或缺的一部分。GUI 為使用者提供了一個視覺上吸引人且使用者友好的介面來與應用程式互動。在 Linux 中,PyGObject 是一個強大的工具,可使用 GObject 內省庫開發 GUI 應用程式。PyGObject 是一個 Python 模組,它為基於 GObject 的庫(包括 GTK、GStreamer 等)提供繫結。在本文中,我們將討論如何在 Linux 中使用 PyGObject 建立更高階的 GUI 應用程式。
什麼是 PyGObject?
GObject 是 GTK、GStreamer 和其他庫使用的基本物件系統,用於在 C 中建立面向物件的軟體。PyGObject 允許開發人員使用 Python 建立 GUI 應用程式,同時利用基於 GObject 的庫的強大功能。
要求
在開始使用 PyGObject 開發 GUI 應用程式之前,我們需要安裝一些依賴項。在本教程中,我們將使用 GTK 庫來建立 GUI 應用程式。要安裝 GTK 庫,請在終端中執行以下命令:
sudo apt-get install libgtk-3-dev
我們還需要安裝 PyGObject 模組,該模組為 GTK 庫提供 Python 繫結。要安裝 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 版本。然後,我們匯入 Gtk 模組,該模組提供了使用 PyGObject 建立 GUI 應用程式的主要類和函式。
接下來,我們建立一個名為 MyWindow 的新類,它繼承自 Gtk.Window 類。在 __init__ 方法中,我們呼叫父建構函式並將視窗的標題設定為“我的視窗”。
然後,我們建立 MyWindow 類的例項並將“destroy”訊號連線到 Gtk.main_quit 函式,該函式將在使用者關閉視窗時呼叫。最後,我們使用 show_all 方法顯示視窗,並使用 Gtk.main 函式啟動主迴圈。
要執行此應用程式,請開啟您的終端並導航到包含 simple_app.py 檔案的目錄。然後,執行以下命令:
python3 simple_app.py
這將開啟一個標題為“我的視窗”的視窗。
向視窗新增部件
現在我們已經建立了一個簡單的 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!”並使用 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 例項變數。我們還將按鈕的“clicked”訊號連線到一個名為 on_button_clicked 的新方法。單擊按鈕時將呼叫此方法。
在 on_button_clicked 方法中,我們將標籤的文字設定為“Button clicked”。
現在,當您執行應用程式時,您應該會看到一個帶有“Hello, World!”標籤和一個“Click me”按鈕的視窗。當您單擊按鈕時,標籤的文字應更改為“Button clicked”。
接下來,讓我們探索可以使用 PyGObject 建立的一些更高階和複雜的 GUI 應用程式。
建立計算器應用程式
讓我們建立一個執行基本算術運算的計算器應用程式。
首先,我們定義一個新的類 CalculatorWindow,它繼承自 Gtk.Window 類。此類用於建立應用程式的主視窗。
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="+")
我們將每個按鈕的 clicked 訊號連線到 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 應用程式的強大工具。它為 GObject 庫提供了一個 Python 風格的 API,GObject 庫是 GTK+ 的底層 C 庫。使用 PyGObject,開發人員可以輕鬆地為 Linux 的桌面環境建立複雜且精密的 GUI 應用程式。
在本文中,我們介紹了 PyGObject 的基礎知識,並演示瞭如何使用該工具建立簡單的文字編輯器和計算器應用程式。我們還探討了 PyGObject 的一些高階功能,包括建立自定義部件和使用 CSS 進行樣式設定。
PyGObject 為在 Linux 中建立 GUI 應用程式提供了廣泛的可能性。開發人員可以利用該工具的功能來構建豐富且互動式的桌面應用程式,從而增強使用者體驗。透過將 Python 的簡單性和易用性與 GObject 庫的強大功能和靈活性相結合,PyGObject 為在 Linux 中建立高階 GUI 應用程式提供了一個強大的解決方案。