【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);// 创建一个 GtkGridgrid = 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 Gtkclass 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 deprecatedbutton.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 Gtkclass 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_rightbutton.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.mzph.cn/news/669006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv5独家改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测

💡💡💡本文独家改进:一种超轻量高效动态上采样DySample, 具有更少的参数、FLOPs,效果秒杀CAFFE和YOLOv5网络中的nn.Upsample 💡💡💡在多个数据集下验证能够涨点,尤其在小目标检测领域涨点显著。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/cate…

多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测

多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-LSTM粒子群优化长短期记忆神经网络…

2 物理层(一):数据通信的基本概念

目录 目标1 数据通信的基本概念1.1 数据通信的基本概念1、数据2、信息3、信号4、信道5、通信和数据通信6、数据通信网7、码元和码字8、数据分组9、基带传输、频带传输和宽带传输基带传输频带传输宽带传输 1.2 数据通信的主要技术指标1.3 数据通信系统1、数据通信系统基本模型编…

【ARM 嵌入式 编译系列 2.7 -- GCC 编译优化参数详细介绍】

文章目录 GCC 编译优化概述常用优化等级-O1 打开的优化选项-O2 打开的优化选项-O3 打开的优化选项-Os 打开的优化选项优化技术使用优化选项的注意事项GCC 编译优化概述 GCC(GNU Compiler Collection)包含了用于C、C++、Objective-C、Fortran、Ada和Go等语言的编译器。在编译…

能和ai聊天的软件有吗?分享4款智能软件!

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。如今&#xff0c;我们只需一款软件&#xff0c;就能与AI进行流畅的对话。今天&#xff0c;就让我们一起揭开这些神秘软件的神秘面纱&#xff0c;看看它们如何让我们的沟通变得…

ONLYOFFICE:一站式办公,探索高效办公新境界

写在前面ONLYOFFICE 介绍ONLYOFFICE 有哪些优势ONLYOFFICE 文档 8.0 发布如何体验 ONLYOFFICEONLYOFFICE 文档部分页面截图 写在前面 在当今这样一个数字化时代&#xff0c;办公软件已经成为我们日常工作中不可或缺的一部分&#xff0c;熟练使用 Office、WPS、腾讯文档、金山文…

搜大学英语题,用哪个软件好?哪款大学搜题工具好用? #媒体#职场发展#媒体

大学生除了学习专业知识外&#xff0c;还应该关注和学习一些软技能&#xff0c;如沟通能力、团队合作和领导力等&#xff0c;以提升自己的综合素质。 1.好大学在线 好大学在线是上海交通大学拥有的中国顶尖慕课平台。 依托该平台&#xff0c;上海交通大学与百度及金智教育实…

机器学习 | 基于网格搜索的SVM超参数调节

机器学习模型被定义为一个数学模型&#xff0c;其中包含许多需要从数据中学习的参数。然而&#xff0c;有一些参数&#xff0c;称为超参数&#xff0c;这些参数不能直接学习。它们通常是由人类在实际训练开始前根据直觉或经验和试验选择的。这些参数通过提高模型的性能&#xf…

网络协议梳理

1 引言 在计算机网络中要做到有条不紊地交换数据&#xff0c;就必须遵守一些事先约定好的规则。这些规则明确规定了所交换的数据的格式以及有关的同步问题。这里所说的同步不是狭义的&#xff08;即同频或同频同相&#xff09;而是广义的&#xff0c;即在一定的条件下应当发生什…

每日一题——LeetCode1403.非递增顺序的最小子序列

方法一 个人方法&#xff1a; 按题目要求&#xff0c;尽可能先取出nums里最大的值&#xff0c;这样才能满足子序列尽可能短且元素之和最大 var minSubsequence function(nums) {nums.sort((a,b)>a-b)let sum1nums.reduce((a,b)>ab,0),sum20,res[]while(sum1>sum2){…

【并发编程】原子累加器

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 JDK8之后有专门做累加的类&#xff0c;效率比自己做快数倍以上 累加器性能比较 参数是方法 // supplier 提供者 无中生有 ()->结果// func…

golang并发安全-sync.Once

什么是sync.Once sync.Once 是 Go 语言中的一种同步原语&#xff0c;用于确保某个操作或函数在并发环境下只被执行一次。它只有一个导出的方法&#xff0c;即 Do&#xff0c;该方法接收一个函数参数。在 Do 方法被调用后&#xff0c;该函数将被执行&#xff0c;而且只会执行一…

Excel——高级筛选匹配条件提取数据

一、筛选多条件 Q&#xff1a;筛选多个条件&#xff0c;并将筛选出的内容复制到其他区域 点击任意一个单元格 点击【数据】——【筛选】——【高级筛选】 选择【将筛选结果复制到其他位置】——在【列表区域】 鼠标选择对应的区域位置&#xff0c;条件区域一定要单独写出来&a…

政安晨:示例演绎Python的函数与获取帮助的方法

调用函数和定义我们自己的函数&#xff0c;并使用Python内置的文档&#xff0c;是成为一位Pythoner的开始。 通过我的上篇文章&#xff0c;相信您已经看过并使用了print和abs等函数。但是Python还有许多其他函数&#xff0c;并且定义自己的函数是Python编程的重要部分。 在本…

【51单片机】LED的三个基本项目(LED点亮&LED闪烁&LED流水灯)(3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

将xyz格式的GRACE数据转成geotiff格式

我们需要将xyz格式的文件转成geotiff便于成图&#xff0c;或者geotiff转成xyz用于数据运算&#xff0c;下面介绍如何实现这一操作&#xff0c;采用GMT和matlab两种方法。 1.GMT转换 我们先准备一个xyz文件&#xff0c;这里是一个降水文件。在gmt中采用以下的语句实现xyz转grd…

java synchronized浅析

介绍synchronized synchronized 是Java编程语言中的一个关键字&#xff0c;用于实现线程间的同步。在多线程环境下&#xff0c;它确保了共享资源在同一时刻只能被一个线程访问或修改&#xff0c;从而避免了因多个线程并发操作同一数据而导致的数据不一致和竞态条件。 synchroni…

070:vue+cesium: 利用canvas设置径向渐变色材质

相关API参考: https://cesium.com/learn/cesiumjs/ref-doc/ColorMaterialProperty.html 第070个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置线性渐变色的材质,这里使用canvas的辅助方法。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. …

阴阳家邹衍的五行相生相克,比星座更火爆

古天乐主演的《寻秦记》&#xff0c;有一个老头叫“邹夫子”&#xff0c;他就是战国的邹衍。 邹衍年轻时&#xff0c;去齐国的稷下学宫&#xff0c;学习儒家。了解到天有五种德行&#xff0c;分别是仁、义、礼、智、信。 《尚书洪范》记载&#xff1a;“五行&#xff1a;一曰水…

springboot155基于JAVA语言的在线考试与学习交流网页平台

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…