【c/python】GtkGrid

一、GtkGrid

GtkGrid 是 GTK (GIMP Toolkit) 中的一个基础容器构件(widget),它可以用来安排其他构件在一个灵活的多行多列的网格中。每个加入网格的构件都可以占据一个或多个行和列。由于 GtkGrid 提供了在二维空间中安排构件的方式,它被广泛用于创建复杂的用户界面。

在 GTK 3 和 GTK 4 中,`GtkGrid` 的使用方法有所不同,下面将给出一个简单的例程,展示如何在 GTK 3 中使用 GtkGrid。如果 GTK 版本是 GTK 4,则代码中的某些部分可能需要做出调整。

首先,确保已经安装了 GTK 开发库。在大多数基于 Debian 的系统上(如 Ubuntu),可以使用以下命令安装:

sudo apt-get install libgtk-3-dev

以下是一个简单的 GTK 3 程序,该程序创建了一个包含几个按钮的窗口,并使用 GtkGrid 来组织这些按钮:

#include <gtk/gtk.h>

int main(int argc, char *argv[]) {
    gtk_init(&argc, &argv);

    GtkWidget *window;
    GtkWidget *grid;
    GtkWidget *button;

    // 创建一个新的窗口
    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(window), "GtkGrid Example");
    gtk_window_set_default_size(GTK_WINDOW(window), 300, 200);
    g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);

    // 创建一个 GtkGrid
    grid = gtk_grid_new();
    gtk_container_add(GTK_CONTAINER(window), grid);

    // 创建并添加第一个按钮
    button = gtk_button_new_with_label("Button 1");
    gtk_grid_attach(GTK_GRID(grid), button, 0, 0, 1, 1); // 放置在网格的 (0, 0)

    // 创建并添加第二个按钮
    button = gtk_button_new_with_label("Button 2");
    gtk_grid_attach(GTK_GRID(grid), button, 1, 0, 1, 1); // 放置在网格的 (1, 0)

    // 创建并添加第三个按钮
    button = gtk_button_new_with_label("Button 3");
    // 放置在网格的 (1, 1),并跨越2列
    gtk_grid_attach(GTK_GRID(grid), button, 0, 1, 2, 1);

    // 显示所有的构件
    gtk_widget_show_all(window);

    // 进入 GTK 主循环
    gtk_main();

    return 0;
}

这段代码完成以下任务:

1. 初始化 GTK 库。
2. 创建一个新的 GTK 窗口,并为其设置标题和默认大小。
3. 连接窗口的 "destroy" 信号到 gtk_main_quit 函数,它将允许在关闭窗口时退出 GTK 主循环。
4. 创建 GtkGrid 并将其添加到窗口中。
5. 创建三个按钮构件,并使用 gtk_grid_attach() 函数将它们放置在合适的位置和跨度中。其中 gtk_grid_attach() 函数的参数分别代表网格、要放置的构件、构件的左上角列和行的坐标,以及构件横向和纵向上占据的列和行数。
6. 通过 gtk_widget_show_all() 展示窗口和其中的所有构件。

7. 进入 GTK 的主循环。

为了编译这个程序,可能需要使用 pkg-config 来获取正确的 GTK 编译和链接标志。一个典型的编译命令如下:

gcc `pkg-config --cflags gtk+-3.0` -o gtk_grid_example gtk_grid_example.c `pkg-config --libs gtk+-3.0`

这将产生一个可执行文件 gtk_grid_example。运行该文件将弹出一个带有布局按钮的窗口。请注意,上面的代码示例仅适用于 GTK 3;GTK 4 中的相应函数可能会有所不同。

二、GtkGrid和GtkBox有什么不同?

​​​​​​​GtkGrid 和 GtkBox 都是 GTK 中用于布局的容器构件,但它们各自有不同的特性和用途。

GtkBox

GtkBox 是一个一维的布局容器,可以按照水平或垂直方向排列子构件。
- 子构件会按照它们被添加的顺序依次排列。
- 可以为子构件设置填充和扩展属性,但所有的子构件仅能在一个维度(水平或垂直)上进行布局。

- 适合用于简单的布局,如果需要在两个维度上进行布局,则可能需要嵌套使用多个 GtkBox 构件。

例如,一个垂直的 GtkBox 可能包含几个水平的 GtkBox 来实现一个网格布局,但这样会使结构变得更为复杂。

GtkGrid

GtkGrid 是一个二维的布局容器,它提供了一种在多行多列网格中排列子构件的方式。
- 子构件可以占据多行或多列,为设计复杂的布局提供了更大的灵活性。
GtkGrid 提供更精细的对齐和分布控制,这使得它更适合实现复杂的用户界面设计。

- 使用 GtkGrid 可以避免嵌套容器的需要,以更直接的方式创建布局。

简言之,`GtkGrid` 提供了比 GtkBox 更复杂和灵活的布局方案。对于需要在两个维度上对构件进行布局的情况,特别是当需要构件跨行或列展示时,`GtkGrid` 是更好的选择。然而,如果只需要在一维上对构件进行简单的排列,那么 GtkBox 是一个更简单和轻量级的选择。

从 GTK 3 开始,`GtkGrid` 通常被推荐用来替代 GtkBox 进行复杂布局的设计,因为它可以减少需要嵌套使用容器的情况,从而使界面的层次结构更加清晰。

三、GtkGrid的python例程

要在Python中使用`GtkGrid`,需要先确保有一个可用的Python GTK+ 3绑定,通常称为`PyGObject`。在大多数基于Debian的系统上,可以通过以下命令来安装:

sudo apt-get install python3-gi python3-gi-cairo gir1.2-gtk-3.0

下面是一个简单的Python例程,这个例程使用`GtkGrid`来创建一个窗口,其中包含一个按钮位于窗口的右下角:

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

class GridWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Grid Example")

        grid = Gtk.Grid()
        self.add(grid)

        # 创建一个按钮,并设置适当的边距
        button = Gtk.Button(label="Right Bottom Button")
        # 这里设置边距是为了让按钮远离窗口的边界
        button.set_margin_right(10)
        button.set_margin_bottom(10)
        
        # 将按钮添加至网格的右下角
        # Gtk.Grid.attach_next_to() 方法可以用于放置构件,
        # 但我们这里使用 Gtk.Grid.attach() 是因为我们希望按钮在右下角,占据一个单元格
        # 我们使用负的左边距和顶边距来确保按钮在右下角
        grid.attach(button, 0, 0, 1, 1)
        grid.set_halign(Gtk.Align.END)
        grid.set_valign(Gtk.Align.END)

        # 连接窗口的 "destroy" 事件到 Gtk.main_quit 函数
        self.connect("destroy", Gtk.main_quit)

# 创建一个 GridWindow 的实例,并显示它
window = GridWindow()
window.show_all()
Gtk.main()

以上脚本主要做了以下几件事情:

1. 导入 gi.repository 的 GTK+ 3 组件。
2. 定义一个`GridWindow`类,该类继承自 Gtk.Window 类,并在初始化方法中设置窗口和布局。
3. 创建一个 Gtk.Grid 容器和一个按钮构件。
4. 将按钮置于网格的右下角。借助 grid 的 set_halign 和 set_valign 方法,并设置为 Gtk.Align.END,可以保证网格本身对齐到窗口的右下角。

5. 最后,连接了窗口的 "destroy" 事件到 GTK 的主循环退出函数 Gtk.main_quit,并显示了所有构件。

请注意`set_margin_right`和`set_margin_bottom`可能在系统的PyGObject版本中不起作用(这取决于PyGObject的版本)。如果是这种情况,应当使用`set_margin_end`和`set_margin_bottom`方法替代。

要运行此脚本,请将其保存为一个 .py 文件,并使用Python 3运行它:

python3 your_script.py

执行脚本后,会出现一个窗口,窗口的右下角会有一个按钮。

这段代码,运行时可能提示:

gtk_grid_example.py:16: DeprecationWarning: Gtk.Widget.set_margin_right is deprecated
  button.set_margin_right(10)

GTK 所发出的 DeprecationWarning 表明,正在使用的方法已经被废弃,也就是说,在未来的 GTK 版本中,此方法可能会被移除。这种警告常常出现当库的开发者希望开发者迁移到新的方法或接口时。

对于遇到的具体情况,`Gtk.Widget.set_margin_right` 方法在 GTK 3.12 版本中被标记为废弃,并且在 GTK 3.14 版本中被移除。官方文档建议使用 set_margin_end 方法来替换 set_margin_right,因为后者不再是国际化的好选择。新的方法是基于文本方向敏感的边距设定,其中 "end" 表示在水平方向上的边距,当语言是从右到左的文字时,就变成了右边距,而对于从左到右的语言,则是左边距。

所有关于边距的方法都有四个替代选项:

set_margin_start: 设置开始边(左边或右边,取决于文本方向)的边距。
set_margin_end: 设置结束边(右边或左边,取决于文本方向)的边距。
set_margin_top: 设置顶部的边距。

set_margin_bottom: 设置底部的边距。

在代码中,可以这样更新来消除 DeprecationWarning 警告:

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

class GridWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="Grid Example")

        grid = Gtk.Grid()
        self.add(grid)

        button = Gtk.Button(label="Right Bottom Button")
        button.set_margin_end(10)  # 使用 set_margin_end 替代 set_margin_right
        button.set_margin_bottom(10)

        grid.attach(button, 0, 0, 1, 1)
        grid.set_halign(Gtk.Align.END)
        grid.set_valign(Gtk.Align.END)

        self.connect("destroy", Gtk.main_quit)

window = GridWindow()
window.show_all()
Gtk.main()

请注意,更新代码后,对于 set_margin_end 方法,它设置的将是按钮的结束边的边距,而不是始终是右边的边距,它会根据应用内容的语言方向发生变化。如果应用面向国际用户,这是一个有利的修改,因为它将遵循用户的语言习惯(LTR或RTL)。如果确定只需要设置固定的边距(比如右边距),需要确保界面不会根据语言方向改变,或者使用其他方法来保证边距适用于界面设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/372624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins配置http请求github,发布release

学无止境&#xff0c;气有浩然&#xff01; Jenkins配置http请求github&#xff0c;发布release 前言Jenkins配置github配置在这里插入图片描述 打完收工! 前言 工作中进行了github迁移&#xff0c;原先的gitlab中配置的Jenkins的CI/CD步骤需要发布到Github发布release版本&am…

【发票识别】新增针对图片发票的识别(升级中)

说明 为了完善发票识别的功能&#xff0c;目前发票识别支持发票图片格式的识别&#xff0c;增加可用性。 体验 体验地址&#xff1a;https://invoice.behappyto.cn/invoice-service/ 体验地址上面有示例的发票&#xff0c;可以下载上传识别或者复制url地址进行识别。 技术栈…

Windows下Node.js下载安装及环境变量配置教程

Windows下Node.js下载安装及环境变量配置教程 安装版本&#xff1a;node-v18.19.0-x64.msi 文章目录 Windows下Node.js下载安装及环境变量配置教程一、Node.js和NPM简介二、下载地址三、安装步骤四、环境配置五、安装淘宝镜像总结 一、Node.js和NPM简介 1、Node.js &#xf…

产品经理学习-产品运营《如何策划一场活动》

互联网活动怎么玩 最常听到的有&#xff1a; 注册有奖、拉新有奖 签到积分 秒杀、大促、神券 和过去相比&#xff0c;现在活动的特征变化&#xff1a; 线上化、形式丰富、覆盖人群广、即时性、效果可控 什么是活动运营 通过策划不同形式的活动&#xff0c;进行有效的资源和…

渗透测试练习题解析 2(CTF web)

题目均来自 BUUCTF 1、[极客大挑战 2019]Upload 1 考点&#xff1a;文件上传漏洞 进入靶场 一看就知道是考察文件上传漏洞&#xff0c;看源码有没有敏感信息 没有什么敏感信息&#xff0c;那我们试着按要求传一张图片看看结果&#xff0c;但是传了 png、jpg 类型的图片后发现上…

云服务器也能挂游戏 安卓模拟器

安卓模拟器云服务器 什么是BlueStacks模拟器主机&#xff1f; 特网科技基于Windows操作系统预装了BlueStacks Android模拟器您能够通过Android模拟器安装Android应用程序、如APP游戏、安卓APP、APP游戏等。 我可以在主机上安装应用程序吗&#xff1f; 你可以在BlueStacks模…

代码随想录算法训练营第二十七天|39. 组合总和、40. 组合总和 II、131. 分割回文串。

39. 组合总和 题目链接&#xff1a;组合总和 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这…

Docker部署Teedy文件系统

目录 效果 安装 1.创建目录 2.创建并启动容器 使用 1.引导页 2.新建一个文档 3.搜索 效果 安装 1.创建目录 mkdir -p /opt/teedy/data && cd /opt/teedy 2.创建并启动容器 docker run -d \ --restart always \ -p 10045:8080 \ -e DOCS_BASE_URLhttp://…

计算机网络——03网络核心

网络核心 网络核心 网络核心&#xff1a;路由器的网络状态基本问题&#xff1a;数据怎样通过网络进行传输 电路交换&#xff1a;为每个呼叫预留一条专有电路分组交换 将要传送的数据分成一个个单位&#xff1a;分组将分组从一个路由器传到相邻路由器&#xff08;hop&#xff…

Nicn的刷题日常之 有序序列判断

目录 1.题目描述 描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 示例2 示例3 2.解题 1.题目描述 描述 输入一个整数序列&#xff0c;判断是否是有序序列&#xff0c;有序&#xff0c;指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 数据…

Java Collection 的多种遍历操作

Java Collection 的多种遍历操作 package com.zhong.collection;import javax.swing.plaf.IconUIResource; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class CollectionFor {public static void main(String[] args) {Coll…

【技术支持】在使用object-fit: cover对大图进行缩放时,图片锯齿化的解决

在chrome浏览器是这样&#xff0c;火狐就正常 1&#xff0c;在使用object-fit: cover时&#xff0c;图片中电线显示明显异常 2&#xff0c;在使用object-fit: cover时&#xff0c;并且禁用Chrome的GPU Rasterization

【入门篇】RedHat 8 打开终端的快捷方式-红帽 RHEL 8如何设置快捷方式

0、序 红帽系统8版本中&#xff0c;终端默认未分配快捷键&#xff0c;需要点击左上角再依次点击终端进行打开&#xff0c;对经常使用终端的用户来说&#xff0c;比较不方便。本文记录添加终端打开快捷键过程。 1、环境 Red Hat Enterprise Linux release 8.4 (Ootpa) 2、默认…

编码世界探秘:原反补码与实数表示,含定点、浮点及BCD编码

数值的编码表示 整数编码表示 在计算机中&#xff0c;因为只有0和1这两种形式&#xff0c;但为了表示数的正&#xff08;&#xff09;&#xff0c;负&#xff08;-&#xff09;号&#xff0c;就要将数的符号以0和1编码。 通常把一个数的最高位定义为符号位&#xff0c;用0表…

【实训】网络规划与部署实训

一 实训目的及意义 本周实训主要是了解网络规划与部署&#xff0c;熟悉三大厂商华为、思科、锐捷交换机路由器以及相关协议的原理和配置&#xff0c;提高学生的动手能力和分析规划部署能力。 实训主要针对计算机网络系统集成的设计与实现的实际训练&#xff0c;着重锻炼学生熟练…

【节选】Go语言的100个错误使用场景|数据类型

Data types &#x1f31f; 章节概述&#xff1a; 基本类型涉及的常见错误 掌握 slice 和 map 的基本概念&#xff0c;避免使用时产生 bug 值的比较 低效的切片初始化&#xff08;#21&#xff09; 实现一个 conver 方法&#xff0c;将一个切片 Foo 转换成另一个类型的切片 Ba…

Go 中如何解析 json 内部结构不确定的情况

本文主要介绍的是关于 Go 如何解析 json 内部结构不确定的情况。 首先&#xff0c;我们直接看一个来提问吧。 问题如下&#xff1a; 上游传递不确定的json&#xff0c;如何透传给下游业务&#xff1f;比如&#xff0c;我解析参数 {"test": 1,"key": {&…

【MATLAB源码-第136期】基于matlab的变色龙群优化算法CSA)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境&#xff1a; MATLAB 2022a 1、算法描述 变色龙群优化算法&#xff08;Chameleon Swarm Algorithm&#xff0c;CSA&#xff09;是一种新颖的群体智能优化算法&#xff0c;受到自然界中变色龙捕食和社交行为的启发。变色龙以其独特的适应能力而著称&#xff0c;能够根…

《爬虫职海录》卷二 • 爬在广州

HI&#xff0c;朋友们好&#xff0c;「爬虫职海录」第二期更新啦&#xff01; 本栏目的内容方向会以爬虫相关的“岗位分析”和“职场访谈”为主&#xff0c;方便大家了解一下当下的市场行情。 本栏目持续更新&#xff0c;暂定收集国内主要城市的爬虫岗位相关招聘信息&#xf…

360,这次你真行:流氓耍到外国佬身上,凌晨1点让我笑岔气

天下&#xff0c;苦流氓软件久矣 在数字世界中&#xff0c;我们常常遭遇一些令人头疼的问题&#xff0c;其中尤以大厂软件的牛皮癣特性为甚。这些软件不仅捆绑安装广告推广&#xff0c;而且手段无所不用其极&#xff0c;让用户感到无可奈何。 在此&#xff0c;我不得不提及四…
最新文章