【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为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

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

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

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

相关文章

OpenAI开放新功能,可通过@一键调用任意GPTs

人工智能技术的快速发展为我们的生活带来了许多便利和创新。作为人工智能领域的重要成果之一&#xff0c;OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型在自然语言处理方面取得了巨大的突破。 近日&#xff0c;OpenAI宣布推出了GPT Mentions功能…

VC++中使用OpenCV绘制直线、矩形、圆和文字

VC中使用OpenCV绘制直线、矩形、圆和文字 在VC中使用OpenCV绘制直线、矩形、圆和文字非常简单&#xff0c;分别使用OpenCV中的line、rectangle、circle、putText这四个函数即可。具体可以参考OpenCV官方文档&#xff1a;https://docs.opencv.org/4.x/index.html 下面的代码展…

Linux进程信号处理:深入理解与应用(2​​)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;its 6pm but I miss u already.—bbbluelee 0:01━━━━━━️&#x1f49f;──────── 3:18 &#x1f504; ◀️…

2. 路由 Vue-Router

目录 2.1 Vue-Router 介绍 2.2 路由配置 2.3 嵌套路由 Vue1&#xff1a;基础跟使用方式 2.1 Vue-Router 介绍 vue 属于单页面应用&#xff0c;所谓路由&#xff0c;就是根据浏览器路径不同&#xff0c;用不同的视图组件替换这个页面内容。 在vue应用中使用路由功能&#x…

JupyterLab 更换内核 使用 conda 虚拟环境

未有conda虚拟环境default先创建环境 conda create -n default python3.8 ipykernel已有conda虚拟环境default激活后安装ipykernel conda activate defaultpip install ipykernel将虚拟环境写入 jupyter notebook 的 kernel 中 python -m ipykernel install --user --name 虚…

SpringBoot security 安全认证(三)——自定义注解实现接口放行配置

背景&#xff1a;通过Security实现了安全管理&#xff0c;可以配置哪些接口可以无token直接访问。但一个麻烦就是每增加一个匿名访问接口时都要去修改SecurityConfig配置&#xff0c;从程序设计上讲是不太让人接受的。 本节内容&#xff1a;即是解决以上问题&#xff0c;增加一…

SpringBoot整合Flowable最新教程(二)启动流程

介绍 文章主要从SpringBoot整合Flowable讲起&#xff0c;关于Flowable是什么&#xff1f;数据库表解读以及操作的Service请查看SpringBoot整合Flowable最新教程&#xff08;一&#xff09;&#xff1b;   其他说明&#xff1a;Springboot版本是2.6.13&#xff0c;java版本是1…

python2.7安装和添加环境变量

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、python的下载地址二、安装步骤1.双击安装包运行安装2.添加环境变量 三、验证是否安装成功总结 前言 最近要用到python,下载安装成功&#xff0c;添加环境变…

Java 数据结构 二叉树(二)红黑树

目录 数据结构图-树 简介 规则 旋转 重新着色 红黑树构建过程 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#xf…

华清远见嵌入式学习——春节作业——2.4日

作业要求&#xff1a; 编写程序实现二叉树的创建&#xff0c;三种遍历自己销毁 作业答案&#xff1a; 作业代码截图 作业代码效果图 作业代码 #include "myhead.h"// 定义二叉树节点结构体 struct Tree {int value; //编号(值)struct Tree* left; //左子树stru…

9隐藏登录用户(无需接触磁盘即可修改文件内容)_Linux_Rootkit.md

Xcellerator 密码学Linux其他逆向工程 文章目录 [Linux Rootkit 第 9 部分&#xff1a;隐藏登录用户&#xff08;无需接触磁盘即可修改文件内容&#xff09;](https://xcellerator.github.io/posts/linux_rootkits_09/)终端设备UTMP用户空间工具如何解析 UTMP&#xff1f;挂钩…

如何实现冻干机和产品全生命周期的验证和监测?

为什么冻干需要工艺优化和合规性 冻干是制药和生物技术产品的关键工艺&#xff0c;需要精确控制关键的温度和压力参数。通过遵守 GMP 和 FDA 合规性等监管准则&#xff0c;您可以生产出更高质量的产品&#xff0c;避免不必要的浪费&#xff0c;并缩短产品上市时间。 要想在冻干…

[linux] kolla-ansible 部署的openstack 修改mariadb默认端口号

kolla-ansible 部署前修改global.yml #freezer_database_backend: "mariadb" database_port: 9306 mariadb_port: 9306如果已经部署成功&#xff0c;直接修改配置文件里的端口号重启是没有用的&#xff0c;怀疑内部做了缓存&#xff0c;查看openstack 使用的memcach…

零基础学编程,从入门到精通,中文编程工具下载,时间选择构件用法

零基础学编程&#xff0c;从入门到精通&#xff0c;中文编程工具下载&#xff0c;时间选择构件用法 一、前言 编程工具下载及源码文件下载路径 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件…

Unity类银河恶魔城学习记录1-11 PlayerPrimaryAttack P38

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Player.cs using System.Collections; using System.Collections.Generic…

基于spring boot实现邮箱发送和邮箱验证

目录 一、邮箱发送实现1. 开通邮箱服务2. 添加邮箱依赖3.添加配置4.添加邮箱通用类5. 测试类 二、邮箱验证实现1.添加依赖2. 添加配置3.添加controller4. 测试 项目地址: https://gitee.com/nssnail/springboot-email 一、邮箱发送实现 1. 开通邮箱服务 使用qq邮箱、163邮箱都…

《计算机网络简易速速上手小册》第10章:未来网络技术趋势(2024 最新版)

文章目录 10.1 边缘计算与网络设计 - 未来网络的速度与激情10.1.1 基础知识10.1.2 重点案例&#xff1a;使用 Python 实现边缘计算的实时视频分析准备工作Python 脚本示例 10.1.3 拓展案例1&#xff1a;智能交通系统Python 脚本示例 - 边缘计算设备上的交通流量分析 10.1.4 拓展…

vcruntime140_1.dll 文件缺失的解决方法,简单的修复方法分享

遇到 vcruntime140_1.dll 文件缺失是一种常见的问题&#xff0c;但无需过于担心&#xff0c;因为这类问题通常有多种解决办法。接下来&#xff0c;我会为大家详细介绍如何处理 vcruntime140_1.dll 文件缺失的情况&#xff0c;以及在解决过程中应该注意的重要事项。 一.vcrunti…

Python flask 模板详解

文章目录 1 概述1.1 模板简介1.2 templates 文件1.3 简单应用 2 模板语法2.1 for 循环2.2 if 判断 3 模板的继承3.1 格式要求3.2 实现示例3.3 复用父模板的内容&#xff1a;super 1 概述 1.1 模板简介 定义&#xff1a;定义好的 html 文件&#xff0c;用于快速开发 web 页面J…

04-OpenFeign-请求超时机制

基于 2021.0.1版本 具体有以下几种超时参数设置 以下仅限2021.0.1 以前的版本&#xff0c;高于该版本的spring cloud 已修复该问题 1、默认的超时时间 默认不生效 连接超时时间10秒、读超时时间60秒&#xff0c;源码在feign.Request.Options#Options()这个方法中 2、open…