【c/python】GtkBox

一、GtkBox及C语言示例

GtkBox是一个容器部件,用于在GTK(GIMP Toolkit)应用程序中水平或垂直地排列多个子部件。以下是一个简单的例子,展示了如何在一个基本的GTK应用程序中使用`GtkBox`来垂直排列两个按钮:
首先,确保你安装了GTK(对于GTK 3或GTK 4,视你所使用的版本而定)。下面的例子将使用GTK 3。
在系统上创建一个名为`gtk_box_example.c`的新文件,并粘贴以下代码作为示例:

#include <gtk/gtk.h>static void on_activate(GtkApplication* app, gpointer user_data) {// 创建一个新的窗口GtkWidget *window = gtk_application_window_new(app);// 设置窗口标题、边框宽度和默认大小gtk_window_set_title(GTK_WINDOW(window), "GtkBox Example");gtk_container_set_border_width(GTK_CONTAINER(window), 10);gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);// 创建一个垂直箱(GtkBox)GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);// 增加一个展开的盒子,使得按钮可以在底部对齐GtkWidget *expander = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);gtk_box_pack_start(GTK_BOX(vbox), expander, TRUE, TRUE, 0);// 创建两个按钮GtkWidget *button1 = gtk_button_new_with_label("Button 1");GtkWidget *button2 = gtk_button_new_with_label("Button 2");// 设置两个按钮的大小请求(为窗体的1/10以下)gtk_widget_set_size_request(button1, 80, 60);gtk_widget_set_size_request(button2, 80, 60);// 设置按钮的边缘空间(margin)gtk_widget_set_margin_end(button1, 20); // 右边距gtk_widget_set_margin_bottom(button1, 20); // 底边距gtk_widget_set_margin_end(button2, 20); // 右边距gtk_widget_set_margin_bottom(button2, 20); // 底边距// 设置按钮的水平和垂直对齐方式(左下角)gtk_widget_set_halign(button1, GTK_ALIGN_END);gtk_widget_set_valign(button1, GTK_ALIGN_END);gtk_widget_set_halign(button2, GTK_ALIGN_END);gtk_widget_set_valign(button2, GTK_ALIGN_END);// 不要让按钮填充箱子剩余的空间,设置expand为FALSEgtk_box_pack_end(GTK_BOX(vbox), button1, FALSE, FALSE, 0);gtk_box_pack_end(GTK_BOX(vbox), button2, FALSE, FALSE, 0);// 将垂直箱添加到窗口中gtk_container_add(GTK_CONTAINER(window), vbox);// 显示所有部件gtk_widget_show_all(window);
}int main(int argc, char *argv[]) {// 创建一个新的GtkApplicationGtkApplication *app = gtk_application_new("org.example.myapp", G_APPLICATION_FLAGS_NONE);g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);// 运行应用程序,将命令行参数传给它int status = g_application_run(G_APPLICATION(app), argc, argv);// 清理g_object_unref(app);return status;
}

现在,编译这个程序。在终端中,使用以下命令(如果使用的是GTK 4,请替换所有`gtk+-3.0`为`gtk4`):

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

编译成功后,可以直接运行编译出的可执行文件:

./gtk_box_example

当运行这个程序时,应该看到一个窗口出现,窗口中有两个垂直排列的按钮。这段代码创建了一个`GtkApplication`,在激活时设置了一个窗口,并添加了一个`GtkBox`作为容器将两个按钮垂直排列。

`gtk_window_set_default_size()`来设置窗口大小,以及利用`gtk_widget_set_halign()`和`gtk_widget_set_valign()`来设置按钮在`GtkBox`中的对齐方式,并使用`gtk_widget_set_size_request()`来设置按钮的请求大小。

使用了一个分隔器部件(expander)来将按钮推到窗口的底部,并使用`gtk_widget_set_margin_*`函数设置按钮的边距来取消按钮和窗口边缘之间的贴合。在按钮和窗口的右侧以及底部分别设置了20像素的边距。`gtk_widget_set_margin_end`和`gtk_widget_set_margin_bottom`函数分别为按钮设置了右侧和底部的边距,这样按钮就不会直接贴在窗口的边缘上了。另外,使用了`GTK_ALIGN_END`来使按钮靠近窗口的右侧和底部。

创建一个空白的"占位"容器`expander`,它会填充大部分的垂直空间,将按钮定位在窗口的左下角。同时,也调整了两个按钮的大小请求,这样即使窗口再大,按钮的最大大小也不会超过80x60像素。填充部件`expander`添加到`vbox`的开始处。然后创建按钮,并使用`gtk_box_pack_end`加到vbox的末尾。`expander`部件将占据所有剩余的垂直空间,并推动按钮到窗口的底部。窗口大小应该是800x600像素,两个按钮将位于窗口的左下角,并且与窗口边界有一些空间。 

每次点击按钮,都会增加到箱子里,因为在这个例子中没有连接任何信号处理函数,所以按钮不会执行任何操作。
请注意,GTK 4中的某些函数和方法可能已经发生了更改,而且本例是基于GTK 3的。如果你使用的是GTK 4,请相应地调整API调用。

二、GtkBox的python示例

下面是将C语言 GTK 示例转换为Python版本,使用PyGObject绑定。这个例子假设已经安装了`PyGObject`和正确版本的GTK+库。
首先,确保安装了`PyGObject`。如果还没有安装,请参考PyGObject的文档了解如何安装。一旦完成安装,可以创建一个名为`gtk_box_example.py`的文件,并粘贴以下代码:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtkclass MyApplication(Gtk.Application):def do_activate(self):# 创建一个新的窗口window = Gtk.ApplicationWindow(application=self)# 设置窗口标题、边框宽度和默认大小window.set_title("GtkBox Example")window.set_border_width(10)window.set_default_size(800, 600)# 创建一个垂直箱(GtkBox)vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)# 增加一个展开的盒子,使得按钮可以在底部对齐expander = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)vbox.pack_start(expander, True, True, 0)# 创建两个按钮button1 = Gtk.Button(label="Button 1")button2 = Gtk.Button(label="Button 2")# 设置两个按钮的大小请求(为窗体的1/10以下)button1.set_size_request(80, 60)button2.set_size_request(80, 60)# 设置按钮的边缘空间(margin)button1.set_margin_end(20)button1.set_margin_bottom(20)button2.set_margin_end(20)button2.set_margin_bottom(20)# 设置按钮的水平和垂直对齐方式(右下角)button1.set_halign(Gtk.Align.END)button1.set_valign(Gtk.Align.END)button2.set_halign(Gtk.Align.END)button2.set_valign(Gtk.Align.END)# 将按钮放置在箱子的底部,不让它们展开或填充vbox.pack_end(button1, False, False, 0)vbox.pack_end(button2, False, False, 0)# 将垂直箱添加到窗口中window.add(vbox)# 显示所有部件window.show_all()if __name__ == "__main__":# 创建一个新的GtkApplicationapp = MyApplication()app.run(None)

确保已经安装了`python3-gi`和`python3-gi-cairo`包以及GTK 3。如果在Gtk.Application.run()中没有特定的命令行参数传递,可以简单地用`None`替代。
要运行这个Python脚本,只需在终端中运行以下命令:

python3 gtk_box_example.py

应该会看到一个包含两个按钮的窗口,这些按钮被放置在窗口的底部右侧,并且它们不会填满窗口的剩余空间。 

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

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

相关文章

用Python Tkinter打造的精彩连连看小游戏【附源码】

文章目录 连连看小游戏&#xff1a;用Python Tkinter打造的精彩游戏体验游戏简介技术背景MainWindow类:职责:方法:Point类: 主执行部分:完整代码&#xff1a;总结&#xff1a; 连连看小游戏&#xff1a;用Python Tkinter打造的精彩游戏体验 在丰富多彩的游戏世界中&#xff0c…

左旋字符串的三种方法,并判断一个字符串是否为另外一个字符串旋转之后的字符串。(strcpy,strncat,strcmp,strstr函数的介绍)

一. 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 通过分析&#xff0c;可以知道实际的旋转次数&#xff0c;其实是k%&#xff08;字符串长度&#xff09;。假设一个字…

西瓜书学习笔记——流形学习(公式推导+举例应用)

文章目录 等度量映射&#xff08;仅保留点与其邻近点的距离&#xff09;算法介绍实验分析 局部线性嵌入&#xff08;不仅保留点与其邻近点的距离还要保留邻近关系&#xff09;算法介绍实验分析 等度量映射&#xff08;仅保留点与其邻近点的距离&#xff09; 算法介绍 等度量映…

树莓派5一键安装C++版本OpenCV

安装环境 本人当前的安装环境&#xff1a; 树莓派5Raspberry Pi os (64-bit) Debian12 Bookworm 镜像下载地址 我这里是将镜像安装好后直接安装opencv&#xff0c;如果不是刚安装好的镜像需要注意是否有openCV的python之类的安装过&#xff0c;不然可能出现编译错误 一、扩展内…

SpringBoot中数据库的连接及Mybatis的配置和使用

目录 1 在pom.xml中引入相关依赖 2 对数据库进行配置 2.1 配置application.yml 2.2 idea连接数据库 (3.2.1有用到) 3 Mybatis的使用 3.1 测试文件的引入 3.2 使用 3.2.1 使用注解(有小技巧(✪ω✪)) 3.2.2 使用动态sql 1 在pom.xml中引入相关依赖 <dependencies&g…

海外多语言盲盒开发:打破语言障碍,连接全球消费者

随着全球化的加速和互联网的普及&#xff0c;语言障碍成为了影响跨国交流和商业活动的重要因素。为了满足跨国市场的需求&#xff0c;海外多语言盲盒开发成为了一个新兴的领域。本文将探讨海外多语言盲盒开发的意义、现状和未来发展。 一、海外多语言盲盒开发的意义 在全球化…

RedHat8.4安装邮件服务器

一、配置发件服务器 1.1 根据现场IP&#xff0c;配置主机名 vim /etc/hosts 192.168.8.120 mail.test.com 将主机名更改为邮件服务器域名mail.test.com 1.2 关闭防火墙&#xff0c;禁止开机启动 systemctl stop firewalld systemctl disable firewalld 1.3 关闭selinux v…

基于springboot就业信息管理系统源码和论文

随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;就业信息管理系统也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化&#xff0c;而…

InnoDB 锁系统(小白入门)

1995年 &#xff0c;MySQL 1.0发布&#xff0c;仅供内部使用&#xff01; 开发多用户、数据库驱动的应用时&#xff0c;最大的一个难点是&#xff1a;一方面要最大程度地利用数据库的并发访问&#xff0c;另一方面还要确保每个用户能以一致性的方式读取和修改数据。 MVCC 并发…

基于python+控制台的员工信息管理系统

基于python控制台的员工信息管理系统 一、系统介绍二、效果展示三、其他系统实现四、获取源码 一、系统介绍 1.添加职工数据 2.显示职工数据 3.查询职工数据 4.修改职工数据 5.删除职工数据 6.保存职工数据 7.排序职工数据 8.统计职工工资数据 9.退出 二、效果展示 三、其他系…

从搜索引擎到答案引擎:LLM驱动的变革

在过去的几周里&#xff0c;我一直在思考和起草这篇文章&#xff0c;认为谷歌搜索正处于被颠覆的边缘&#xff0c;它实际上可能会影响 SEO 作为业务牵引渠道的可行性。 考虑到谷歌二十多年来的完全统治地位&#xff0c;以及任何竞争对手都完全无力削弱它&#xff0c;坦率地说&…

CSS transition(过渡效果)详解并附带示例

CSS过渡效果&#xff08;CSS transitions&#xff09;是一种在元素属性值发生变化时&#xff0c;通过指定过渡效果来实现平滑的动画效果的方法。通过定义起始状态和结束状态之间的过渡属性&#xff0c;可以使元素的变化更加流畅和可视化。 过渡效果的基本语法如下&#xff1a;…

乐意购项目前端开发 #6

一、商品详情页面 代码模版 创建Detail文件夹, 然后创建index.vue文件 <script setup> import { getDetail } from "/api/goods/index"; import { ref, onMounted } from "vue"; import { useRoute } from "vue-router"; import { useCar…

SpringBoot 登录检验JWT令牌 生成与校验

JWT官网 https://jwt.io/ 引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>设置过期时间 LocalDateTime localDateTime LocalDateTime.now().…

STM32--SPI通信协议(1)SPI基础知识总结

前言 I2C (Inter-Integrated Circuit)和SPI (Serial Peripheral Interface)是两种常见的串行通信协议&#xff0c;用于连接集成电路芯片之间的通信&#xff0c;选择I2C或SPI取决于具体的应用需求。如果需要较高的传输速度和简单的接口&#xff0c;可以选择SPI。如果需要连接多…

css1字体属性

一.font-family(字体系列&#xff09; 不同字体系统用&#xff0c;隔开&#xff1b; 多个字母的字体系统用“”&#xff1b; 二.font-size&#xff08;字体大小&#xff09;&#xff08;有单位px&#xff09;&#xff08;默认字体16px&#xff09; 三.font-weight&#xff08…

Leetcode—535. TinyURL 的加密与解密【中等】

2024每日刷题&#xff08;110&#xff09; Leetcode—535. TinyURL 的加密与解密 实现代码 class Solution { public:// Encodes a URL to a shortened URL.string encode(string longUrl) {while(!urlToCode.count(longUrl)) {string code;for(int i 0; i < 6; i) {code…

Blender使用Rigify和Game Rig Tool基础

做动画需要的几个简要步骤&#xff1a; 1.建模 2.绑定骨骼 3.绘制权重 4.动画 1.Rigify是干嘛用的&#xff1f; 》 绑定骨骼 2.Game Rig Tool干嘛用的&#xff1f; 》 修复Rigify绑定骨骼做的动画导入游戏引擎的问题&#xff0c;如果Rigify自身修复了就不需要这个插件了&#…

Python算法100例-1.2 兔子产子

完整源代码项目地址&#xff0c;关注博主私信’源代码’后可获取 1&#xff0e;问题描述 有一对兔子&#xff0c;从出生后的第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子&#xff0c;假设所有的兔子都不死&#xff0c;问30个月内每个月的兔子总对数为…

ele-h5项目使用vue3+vite+vant4开发:第四节、业务组件-SearchView组件开发

需求分析 展示切换动画搜索框输入文字&#xff0c;自动发送请求搜索结果展示搜索状态维护历史搜索展示&#xff0c;点击历史搜索后发送请求历史搜索更多切换动画效果 <script setup lang"ts"> import OpSearch from /components/OpSearch.vue import { ref } f…