【c/python】GtkBox

news2024/9/28 15:31:05

一、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为FALSE
    gtk_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[]) {
    // 创建一个新的GtkApplication
    GtkApplication *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 Gtk

class 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__":
    # 创建一个新的GtkApplication
    app = MyApplication()
    app.run(None)

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

python3 gtk_box_example.py

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

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

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

相关文章

flutter的报错提示:type ‘Null‘ is not a subtype of type ‘int‘

flutter的报错提示&#xff1a; 是什么原因呢&#xff0c;解决问题&#xff1a; articleBean.originId是int类型&#xff0c;map[originId]是因为originId不存在而为null,所以可以把articleBean.originId map[originId]!;注释

设备的层次结构 - 驱动程序的复杂层次结构

由于设备对象的水平结构和垂直结构&#xff0c;组成了Windows设备的树形结构图。在Windows中出事的时候会有一个根设备&#xff0c;为了理解简单&#xff0c;我们将PCI总线想象成根总线&#xff08;根总线其实不是PCI总线&#xff0c;只是为了理解方便&#xff09;。查到PCI总线…

paddle环境安装

一、paddle环境安装 如pytorch环境安装一样&#xff0c;首先在base环境下创建一个新的环境来安装paddlepaddle框架。首先创建一个新的环境名叫paddle。执行如下命令。 conda create -n paddle python3.8创建好了名叫paddle这个环境以后&#xff0c;进入到这个环境中&#xff…

程序员的悲哀:知名Python库requests作者失业了

在当今这个快速发展的科技时代&#xff0c;程序员作为创新的驱动力&#xff0c;一直被视为时代的宠儿。然而&#xff0c;即使在这样一个充满机会的领域&#xff0c;也有着不为人知的辛酸。近日&#xff0c;一个令人震惊的消息传遍了编程社区&#xff1a;知名Python库requests的…

07 SB3之@HttpExchange(TBD)

HttpExchange是SpringBoot3的新特性. Spring Boot3 提供了新的 HTTP 的访问能力&#xff0c;封装了Http底层细节. 通过接口简化 HTTP远程访问&#xff0c;类似 Feign 功能。 SpringBoot 中定义接口提供 HTTP 服务 --> 框架生成的代理对象实现此接口 --> 框架生成的代理…

MySQL进阶之触发器

MySQL进阶之触发器 目录 MySQL进阶之触发器什么是触发器触发器的使用场景自定义触发器查看触发器删除触发器示例 什么是触发器 触发器是一种特殊的存储过程&#xff0c;它通常与表一起创建、修改和删除 触发器关键字&#xff1a;trigger&#xff0c;是指事先为某张表绑定一段…

【论文阅读笔记】Taming Transformers for High-Resolution Image Synthesis

Taming Transformers for High-Resolution Image Synthesis 记录前置知识AbstractIntroductionRelated WorkMethodLearning an Effective Codebook of Image Constituents for Use in TransformersLearning the Composition of Images with Transformers条件合成合成高分辨率图…

[ESP32 IDF]web server

目录 通过web server控制LED 核心原理解析 分区表 web server的使用 错误Header fields are too long的解决 通过web server控制LED 通过网页控制LED灯的亮灭&#xff0c;一般的ESP32开发板都可以实现&#xff0c;下面这篇文章是国外开发者提供的一个通过web server控制…

进程间通信的7种方式以及优点

七种通信方式为有名管道、无名管道、信号、消息队列、共享内存、信号灯集、套接字。 无名管道&#xff1a; 无名管道是没有名字的管道&#xff0c;是一个特殊的文件。 因为没有名字只能进行亲缘进程之间进行通信&#xff0c;也可以自己和自己进行通信。 无名管道打开会开启两个…

只用一台服务器部署上线(宝塔面板) 前后端+数据库

所需材料 工具&#xff1a;安装宝塔面板服务器至少一台、域名一个 前端&#xff1a;生成dist文件&#xff08;前端运行build命令&#xff09; 后端&#xff1a;生成jar包&#xff08;maven运行package命令&#xff09; 准备&#xff1a; 打开宝塔面板&#xff0c;点击进入软…

断电保持霍尔传感器

断电保持霍尔传感器的工作原理 断电保持霍尔传感器是一种利用变压器或共振电路的检测元件&#xff0c;通过检测物体与探头之间的物理距离控制电路的开关状态&#xff0c;从而实现对物体位置和状态的监测。该开关可以通过调试和校准以满足不同场合的要求。 断电保持霍尔传感器控…

【LeetCode】每日一题 2024_1_31 找出不同元素数目差数组(数组/哈希)

文章目录 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01;题目&#xff1a;找出不同元素数目差数组题目描述代码与解题思路 LeetCode&#xff1f;启动&#xff01;&#xff01;&#xff01; 1 月的最后一天&#xff0c;每日一题又坚持了一个月呀 题目&#xff…

编程实例分享,电玩城计时电玩店计时收费管理系统软件,可以控制电视电源计时程序

编程实例分享&#xff0c;电玩城计时电玩店计时收费管理系统软件&#xff0c;可以控制电视电源计时程序 一、前言 以下教程以 佳易王电玩店计时计费软件V18.0为例说明&#xff0c;软件程序下载可以点击最下方官网卡片 如上图&#xff0c;开始计时图片改变&#xff0c;并记录…

智能分析网关V4+EasyCVR视频融合平台——高速公路交通情况的实时监控和分析一体化方案

随着2024年春运帷幕的拉开&#xff0c;不少人的返乡之旅也即将开启&#xff0c;从这几日的新闻来看&#xff0c;高速上一路飘红。伴随恶劣天气&#xff0c;加上激增的车流&#xff0c;极易导致高速瘫痪&#xff0c;无法正常使用。为解决此问题&#xff0c;助力高速高效运营&…

K8s 集群可观测性-数据分流最佳实践

简介 在微服务架构下&#xff0c;一个 k8s 集群中经常会部署多套业务&#xff0c;同时也意味着不同团队、不同角色、不同的业务会在同一集群中&#xff0c;需要将不同业务的数据在不同的空间进行管理和查看。 在传统的主机环境下&#xff0c;这个是可以通过不同的主机部署 Da…

C语言项目---贪吃蛇

目录 一 、知识铺垫1.win32API介绍 二、贪吃蛇的数据结构的设计1.整体框架2.初始化界面3.贪吃蛇的运行4.游戏的退出 三、整体代码 一 、知识铺垫 贪吃蛇涉及的知识&#xff1a;C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、win32API等 1.win32API介绍 Windows…

vue项目在线预览和下载文档

在线预览&#xff1a;利用微软提供的Office Online平台&#xff0c;即可实现在线预览doc、ppt、excel等文档。 地址为&#xff1a;https://view.officeapps.live.com/op/view.aspx 下载&#xff1a;若要实现下载功能&#xff0c;直接将url赋值给a标签的href属性即可 下载实现方…

如何从电脑恢复已删除的文件

意外删除文件可能会导致噩梦般的场景。即使文件被故意删除&#xff0c;您仍然可能需要恢复文件的过去草稿或版本。值得庆幸的是&#xff0c;有多种方法可以恢复电脑上已删除的文件&#xff0c;无论是否花钱。以下是四种最常见的已删除文件恢复方法。 如何从电脑恢复已删除的文件…

移动端常见布局

单独移动端页面&#xff08;主流&#xff09; 1&#xff0c;流式布局&#xff08;百分比布局&#xff09; 流式布局&#xff0c;就是百分比布局&#xff0c;也称非固定像素布局 通过盒子的宽度设置成百分比来根据屏幕的宽度来进行伸缩&#xff0c;不受固定像素的限制&#x…

第二十四天| 77. 组合

Leetcode 77. 组合 题目链接&#xff1a;77 组合 题干&#xff1a;给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 思考&#xff1a;回溯法。把回溯法的搜索过程抽象为树形结构。 每次从集合中选取元素&#xff0…