Python桌面应用开发GTK3 Glade

文章目录

  • Github
  • 官方文档
  • 简介
  • 环境配置
  • 注意版本
  • gtk4 版本 Demo.py
  • Glade Github
  • Glade 教程
  • Glade 简介
    • 可视化设计
    • 生成XML描述文件
    • 与多种编程语言兼容
    • 与IDE集成
  • 安装 Glade
  • demo.glade
  • gtk+3 版本 demo.py

Github

  • https://github.com/GNOME/pygobject
  • https://gitlab.gnome.org/GNOME/pygobject

官方文档

  • https://pygobject.readthedocs.io/en/latest/

简介

PyGObject是一个用于将GTK+和其他GLib库与Python语言绑定的工具。它允许开发者使用Python语言编写基于GTK+和GLib的应用程序,为Python提供了访问GTK3及其依赖库的接口。

  • GTK3绑定: PyGObject主要用于与GTK3库进行绑定,使开发者能够使用Python语言构建现代的图形用户界面。
  • GLib绑定: 除了GTK3,PyGObject还提供了对GLib库的绑定。GLib是GTK+的底层库,提供了许多通用的功能,例如事件循环、数据结构等。
  • 对象系统: PyGObject使用了GTK+的对象系统。在Python中,你可以使用gi.repository模块导入并操作GTK3的类,例如Gtk.Window、Gtk.Button等。
  • 自动类型转换: PyGObject通过使用gobject-introspection库,实现了自动的类型转换。这意味着Python开发者可以直接使用GTK3和GLib的API,而无需手动编写大量的绑定代码。
  • 异步支持: PyGObject支持GLib的异步操作,允许你以异步的方式执行任务,而不会阻塞应用程序的用户界面。
  • 版本兼容性: 由于GTK3是一个不断演进的库,PyGObject也在不断更新以保持与GTK3的兼容性。开发者应该根据他们使用的GTK3版本选择相应的PyGObject版本。

环境配置

  • python3
brew install gobject-introspection libffi
# 检查 libffi 路径
brew --prefix libffi
# 添加libffi环境变量
export PKG_CONFIG_PATH="/usr/local/opt/libffi:$PKG_CONFIG_PATH"
  • 搜索pygobject版本:https://pypi.org/search/
  • pygobject历史版本:https://pypi.org/project/PyGObject/#history
pip3 install --upgrade pip
# gtk4
pip3 install pygobject
  • 或者直接安装
brew install pygobject3 gtk4

注意版本

使用gtk+3版本,需要将 gtk4 版本先卸载

gi.require_version("Gtk", "3.0")
# 卸载gtk4
brew uninstall gtk4

gtk4 版本 Demo.py

import sys

import gi

gi.require_version("Gtk", "4.0")
from gi.repository import GLib, Gtk


class MyApplication(Gtk.Application):
    def __init__(self):
        super().__init__(application_id="com.example.MyGtkApplication")
        GLib.set_application_name("My Gtk Application")

    def do_activate(self):
        window = Gtk.ApplicationWindow(application=self, title="Hello World")
        window.present()


app = MyApplication()
exit_status = app.run(sys.argv)
sys.exit(exit_status)

Glade Github

  • https://github.com/GNOME/glade
  • https://gitlab.gnome.org/GNOME/glade
git clone https://github.com/GNOME/glade.git

Glade 教程

  • https://developer.gnome.org/
    Python桌面应用开发GTK3 Glade_第1张图片

Glade 简介

  • Glade是一个用于创建GTK图形用户界面的用户界面构建器。它允许开发者通过可视化方式设计和布局GUI元素,而不必手动编写代码。Glade生成XML格式的描述文件,描述了用户界面的结构和属性。然后,这个XML文件可以由程序加载和解释,从而创建用户界面。

可视化设计

  • Glade提供了一个直观的图形用户界面,允许用户通过拖放方式设计和布局界面元素,无需手动编写代码。

生成XML描述文件

  • 设计完成后,Glade会生成一个XML格式的描述文件,其中包含了用户界面的结构和属性信息。

与多种编程语言兼容

  • 由于生成的描述文件是基于XML的,因此可以与多种编程语言一起使用。GTK支持多种编程语言,包括C、C++、Python等。

与IDE集成

  • Glade可以与多个集成开发环境(IDE)一起使用,例如GNOME Builder,以便更方便地进行开发和调试。

安装 Glade

# 目前版本支持gtk+3
brew install glade
glade --version
# 启动
glade

Python桌面应用开发GTK3 Glade_第2张图片

demo.glade



<interface>
  <requires lib="gtk+" version="3.24"/>
  <object class="GtkWindow" id="window">
    <property name="width-request">400property>
    <property name="height-request">200property>
    <property name="can-focus">Falseproperty>
    <property name="title" translatable="yes">demoproperty>
    <child>
      <object class="GtkBox" id="box">
        <property name="visible">Trueproperty>
        <property name="can-focus">Falseproperty>
        <property name="orientation">verticalproperty>
        <child>
          <object class="GtkButton" id="button">
            <property name="label" translatable="yes">buttonproperty>
            <property name="visible">Trueproperty>
            <property name="can-focus">Trueproperty>
            <property name="receives-default">Trueproperty>
            <property name="margin-start">10property>
            <property name="margin-end">10property>
            <property name="margin-top">10property>
            <property name="margin-bottom">10property>
          object>
          <packing>
            <property name="expand">Falseproperty>
            <property name="fill">Trueproperty>
            <property name="position">0property>
          packing>
        child>
        <child>
          <object class="GtkComboBoxText" id="combobox">
            <property name="visible">Trueproperty>
            <property name="can-focus">Falseproperty>
            <property name="margin-start">10property>
            <property name="margin-end">10property>
            <property name="margin-top">10property>
            <property name="margin-bottom">10property>
            <property name="active">0property>
            <property name="active-id">1property>
            <items>
              <item id="1" translatable="yes">item1item>
              <item id="2" translatable="yes">item2item>
              <item id="3" translatable="yes">item3item>
              <item id="4" translatable="yes">item4item>
            items>
          object>
          <packing>
            <property name="expand">Falseproperty>
            <property name="fill">Trueproperty>
            <property name="position">1property>
          packing>
        child>
        <child>
          <object class="GtkEntry" id="entry">
            <property name="visible">Trueproperty>
            <property name="can-focus">Trueproperty>
            <property name="margin-start">10property>
            <property name="margin-end">10property>
            <property name="margin-top">10property>
            <property name="margin-bottom">10property>
          object>
          <packing>
            <property name="expand">Falseproperty>
            <property name="fill">Trueproperty>
            <property name="position">2property>
          packing>
        child>
      object>
    child>
  object>
interface>

gtk+3 版本 demo.py

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


class MyApplication:
    def __init__(self):
        builder = Gtk.Builder()
        builder.add_from_file("ui/demo.glade")

        self.window = builder.get_object("window")
        self.window.set_position(Gtk.WindowPosition.CENTER)
        self.window.connect("destroy", self.__on_window_destroy)

        self.__button = builder.get_object("button")
        self.__combobox = builder.get_object("combobox")
        self.__entry = builder.get_object("entry")

        self.__button.connect("clicked", self.__on_button_clicked)
        self.__combobox.connect("changed", self.__on_combobox_changed)
        self.__entry.connect("changed", self.__on_entry_changed)
        self.__entry.connect("activate", self.__on_entry_activate)

    def __on_window_destroy(self, widget):
        print("Close Window")
        Gtk.main_quit()

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

    def __on_combobox_changed(self, widget):
        selected_index = widget.get_active()
        selected_text = widget.get_active_text()
        print("Selected index option:", selected_index, selected_text)

    def __on_entry_changed(self, widget):
        new_text = widget.get_text()
        print("Entry text changed:", new_text)

    def __on_entry_activate(self, widget):
        entered_text = widget.get_text()
        print("Entry activated with text:", entered_text)


if __name__ == "__main__":
    Gtk.init()
    app = MyApplication()
    app.window.show_all()
    Gtk.main()

你可能感兴趣的:(python,开发语言)