首页 > 编程语言 >桌面应用开发GTK3 Glade (Python)

桌面应用开发GTK3 Glade (Python)

时间:2024-02-02 16:34:48浏览次数:36  
标签:__ 10 .__ Python text self Gtk Glade GTK3

目录

Github

官方文档

简介

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"
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)

demo.glade

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
  <requires lib="gtk+" version="3.24"/>
  <object class="GtkWindow" id="window">
    <property name="width-request">400</property>
    <property name="height-request">200</property>
    <property name="can-focus">False</property>
    <property name="title" translatable="yes">demo</property>
    <child>
      <object class="GtkBox" id="box">
        <property name="visible">True</property>
        <property name="can-focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkButton" id="button">
            <property name="label" translatable="yes">button</property>
            <property name="visible">True</property>
            <property name="can-focus">True</property>
            <property name="receives-default">True</property>
            <property name="margin-start">10</property>
            <property name="margin-end">10</property>
            <property name="margin-top">10</property>
            <property name="margin-bottom">10</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkComboBoxText" id="combobox">
            <property name="visible">True</property>
            <property name="can-focus">False</property>
            <property name="margin-start">10</property>
            <property name="margin-end">10</property>
            <property name="margin-top">10</property>
            <property name="margin-bottom">10</property>
            <property name="active">0</property>
            <property name="active-id">1</property>
            <items>
              <item id="1" translatable="yes">item1</item>
              <item id="2" translatable="yes">item2</item>
              <item id="3" translatable="yes">item3</item>
              <item id="4" translatable="yes">item4</item>
            </items>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkEntry" id="entry">
            <property name="visible">True</property>
            <property name="can-focus">True</property>
            <property name="margin-start">10</property>
            <property name="margin-end">10</property>
            <property name="margin-top">10</property>
            <property name="margin-bottom">10</property>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </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()

标签:__,10,.__,Python,text,self,Gtk,Glade,GTK3
From: https://www.cnblogs.com/wufengsheng/p/18003415

相关文章

  • Python Web 项目部署
    记录下一般的Pythonweb项目开发后如何部署到外部服务器上,供用户访问。1简要本质三件事:租个服务器(含公网ip)+配置环境电脑+公网IP自己电脑+拉专线代码放在服务器程序运行起来2搞一台云服务器租一个linux系统的云服务器,并获得一个公网IP,例如直接购买云服务......
  • Python数据类型——数字、布尔、空类型
    一、数字类型整型int:就是整数,既是整型的代表,又是定义整型的内置函数定义一个整型,并不一定非要使用int浮点类型float:凡是带有小数点的类型,都可以认为是浮点类型。既是浮点型的代表,又是定义浮点型的内置函数定义一个浮点型,并不一定非要使用float内置函数type:返回变量的类型,告诉我......
  • 一、Python概述
    一、python脚本的结构1-1python头部注释头注释:为解释器定制的规则。头注释作用:被系统或者解释器所用,如:告诉系统python解释器在那个位置、脚本编码格式是什么。头注释结构:#注释内容常见的头注释:#coding:utf-8:定义coding,告诉系统脚本是何编码格式。#!/usr/bin/env:定义#......
  • 理论与实战:一篇看懂Python词云
    理论与实战:一篇看懂Python词云后宫王镇贴前言:本文初编辑于2024年2月2日该项目代码的仓库地址:https://github.com/A-Piece-Of-Maple/WordCloudCSDN:https://blog.csdn.net/rvdgdsva博客园:https://www.cnblogs.com/hassle总结截至2024.2.2,想要学习词云,能够找到的文章大部......
  • 13个可能未使用过的Python特性
    大多数程序员不知道的令人难以置信的功能列表。Python是顶级编程语言之一,它具有许多程序员从未使用过的许多隐藏功能。在这篇文章中,我将分享你可能从未使用过的13个Python特性。1.列表Stepping这是一个step参数,可以通过采取几个步骤来分割你的列表。此外,你可以使用step参数......
  • Python中用PyTorch机器学习神经网络分类预测银行客户流失模型|附代码数据
    阅读全文:http://tecdat.cn/?p=8522最近我们被客户要求撰写关于神经网络的研究报告,包括一些图形和统计输出。分类问题属于机器学习问题的类别,其中给定一组特征,任务是预测离散值。分类问题的一些常见示例是,预测肿瘤是否为癌症,或者学生是否可能通过考试在本文中,鉴于银行客户的某些......
  • 桌面应用开发GOTK3 Glade (GO语言)
    目录Github简介环境变量官方示例demo.gladeGithubmain.goGithubhttps://github.com/GNOME/gtkhttps://github.com/gotk3/gotk3gitclonehttps://github.com/gotk3/gotk3.git简介gotk3项目为GTK3和依赖项目提供Go绑定。每个组件都有自己的子目录,用作包的导入路径......
  • 桌面应用开发GTK Glade (C语言)
    目录Github教程简介可视化设计生成XML描述文件与多种编程语言兼容与IDE集成安装Glade示例demo.gladedemo.cGithubhttps://github.com/GNOME/gtkhttps://github.com/GNOME/gladegitclonehttps://github.com/GNOME/glade.git教程https://developer.gnome.org/简介G......
  • Python3 JSON
    PythonJSON转换 python3的json.loads不支持encoding#python3.11JSON序列化、反序列化importjsondefdata=’{\"Message":"消息", \"Timestamp":"时间戳" \}' #字符串转换编码集为UTF-8json_str=data.encode('ut......
  • PyQt5+python AttributeError: 'QMainWindow' object has no attribute 'slot1'解决办
    Step1.原因分析因为以前写过pyqt5,所以还是有一定的基础的,但是最近重新写上位机的时候,突然发现以前的办法不好用了,以前就是直接从Qtdesigner创建完成后,使用指令生成一个py文件,从main文件中调用就可以了,这次发现,直接使用槽函数,会报错AttributeError:'QMainWindow'objec......