PyGObject:在Linux上创建Python GUI应用程序指南

创建图形用户界面(GUI)应用程序是将您的想法变为现实并使您的程序更加用户友好的绝佳方式。

PyGObject是一个Python库,它允许开发者在Linux桌面上使用GTKGIMP工具集)框架来创建GUI应用程序。GTK在Linux环境中得到广泛应用,为许多流行的桌面应用程序GeditGNOME终端等提供动力。

在本文中,我们将探讨如何使用PyGObject在Linux桌面环境中创建GUI应用程序。我们将从了解PyGObject是什么、如何安装它开始,然后继续构建一个简单的GUI应用程序。

第一步:在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)。
  • MyAppGtk.Window继承,后者代表了应用程序的主窗口。
  • 我们使用Gtk.Button创建了一个按钮,并设置了按钮的标签为“点击我”。我们还连接了按钮的“点击”信号到on_button_clicked方法,当点击时会打印出“你好,世界!”。
  • 通过调用Gtk.main()启动应用程序的主循环。这个循环等待事件(比如点击)并相应地更新应用程序。

要运行该应用,导航到保存 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更改说明:

  • 按钮拥有绿色背景,标签拥有自定义字体大小和颜色。
  • 按钮的边角进行了圆角处理,以实现现代外观。
PyGObject GUI Application with CSS Styling
结论

PyGObject是使用Python在Linux桌面创建GUI应用程序的强大工具。通过利用Python的灵活性和简单性以及GTK的丰富功能,开发者可以创建功能丰富且视觉吸引力的应用程序。

在本指南中,我们介绍了设置PyGObject的基本知识,创建简单的窗口,处理按钮点击,添加用户输入,甚至应用自定义CSS样式。

您可以扩展这些示例来构建更复杂的应用程序,例如文件管理器媒体播放器,甚至是专业级软件。有了PyGObjectGTK,创建桌面应用程序的可能性几乎是无限的!

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