【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.hqwc.cn/news/449766.html

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

相关文章

网络安全全栈培训笔记(60-服务攻防-中间件安全CVE复现WeblogicJenkinsGlassFish)

第60天 服务攻防-中间件安全&CVE复现&Weblogic&Jenkins&GlassFish 知识点: 中间件及框架列表: lIS,Apache,Nginx,Tomcat,Docker,Weblogic,JBoos,WebSphere,Jenkins, GlassFish,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Sprng,Flask,jQuery 1、中间件-Web…

Python 数据分析(PYDA)第三版(二)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 四、NumPy 基础知识&#xff1a;数组和向量化计算 原文&#xff1a;wesmckinney.com/book/numpy-basics 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 此开放访问网络版…

混合攻击流量对系统安全性的综合评估

很多针对安全设备的测试仅仅针对安全设备本身的防护&#xff0c;比如防御的漏洞攻击行为、恶意代码是否足够多&#xff0c;能否抵御大流量的L23层DDoS或者应用层的DDoS攻击&#xff0c;却没有考虑是否防御攻击时&#xff0c;一并阻止了正常的业务流量。以下图为例&#xff0c;当…

【动态规划】【C++算法】1335 工作计划的最低难度

作者推荐 【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数 本文涉及知识点 动态规划汇总 LeetCode1335. 工作计划的最低难度 你需要制定一份 d 天的工作计划表。工作之间存在依赖&#xff0c;要想执行第 i 项工作&#xff0c;你必须完成全部 j 项工作&am…

STM32控制DHT11温湿度传感器模块获取温湿度数据

时间记录&#xff1a;2024/1/29 一、DHT11引脚介绍 &#xff08;1&#xff09;VCC&#xff1a;电源引脚&#xff0c;3.3-5.5V &#xff08;2&#xff09;DATA&#xff1a;数据输入输出引脚 &#xff08;3&#xff09;NC&#xff1a;保留引脚&#xff0c;悬空即可 &#xff08;…

思科交换机调试流程介绍(主要适用于OEM的思科的浪潮FS6700)

文章目录 1、光纤交换机配置流程2、交换机初始化 2-1、 默认管理地址 2-2、 更改默认管理地址 2-3、 远程登录模式 2-4、 更改用户名 3、VSAN 3-1、什么是VSAN 3-2、关于 VSAN 的一些主意事项 3-3、配置VSAN 3-4、配置验证…

获取真实 IP 地址(二):绕过 CDN(附链接)

一、DNS历史解析记录 DNS 历史解析记录指的是一个域名在过去的某个时间点上的DNS解析信息记录。这些记录包含了该域名过去使用的IP地址、MX记录&#xff08;邮件服务器&#xff09;、CNAME记录&#xff08;别名记录&#xff09;等 DNS 信息。DNS 历史记录对于网络管理员、安全研…

Multisim14.0仿真(四十四)基于74LS148的8路呼叫器设计

一、74LS148简介: 74LS148是一款具有扩展功能的8-3线优先编码器,有8个信号输入端、3个二进制码输出端、1个输入使能源端、1个选择输出端和1个扩展端。 二、74LS148工作原理 74LS148有8个信号输入端,3个二进制码输出端、输入使能EI、输出使能EO和优先代码工作状态标志GS。EI…

matlab|【EI复现】日前日内多阶段多时间尺度源荷储协调调度

目录 一、模型 二、程序运行 三、下载链接 多阶段多时间尺度的协调调度的优势是考虑新能源出力的波动性与随机性&#xff0c;减少需求响应负荷的不确定性对电网制定的日前调度计划准确性造成的影响&#xff0c;也就是能够更加精准的进行调度和分析&#xff0c;优化结果的可用…

vio参数文件内相机imu参数的修改

imu标定工具 https://github.com/mintar/imu_utils网络上有各种IMU校准工具和校准教程&#xff0c;曾经花费了巨大精力跟着各种教程去跑校准。 然而&#xff0c;标定使用的数据都是在静止状态下录制的&#xff0c;我们在使用vio或者imu-cam联合标定的时候&#xff0c;imu确是处…

机器学习_14_多分类及多标签分类算法

文章目录 1 单标签二分类问题1.1 单标签二分类算法原理1.2 Logistic算法原理 2 单标签多分类问题2.1 单标签多分类算法原理2.2 Softmax算法原理2.3 ovo2.4 ovr2.5 OvO和OvR的区别2.6 Error Correcting 3 多标签算法问题3.1 Problem Transformation Methods3.1.1 Binary Relevan…

Linux信号详解~

目录 前言 一、初识信号 二、信号的概念 三、信号的发送与捕捉 3.1 信号的发送 3.1.1 kill 命令 3.1.2 kill 函数 3.1.3 raise函数 3.1.4 abort函数 3.2 信号的捕捉 3.2.1 signal函数 3.2.2 sigaction函数 3.2.3 图示 四、信号的产生 4.1 硬件异常产生信号 4.2 …