【c/python】用GTK实现一个带菜单的窗口

news2024/9/20 22:46:42

一、用python

在GTK中创建一个带菜单的窗口,可以通过使用`Gtk.MenuBar`、`Gtk.MenuGtk.MenuItem`组件来构建菜单。以下是一个基本的例子,展示了如何使用Python的`PyGObject`库创建一个简单的带菜单栏的GTK窗口。

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class MenuExampleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Menu Example")

        self.set_default_size(200, 200)

        # Create a vertical box to pack widgets into
        vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(vbox)

        # Create a MenuBar and append items
        menubar = Gtk.MenuBar()
        filemenu = Gtk.Menu()
        file_item = Gtk.MenuItem("File")
        file_item.set_submenu(filemenu)
        
        # File menu items
        new_item = Gtk.MenuItem("New")
        filemenu.append(new_item)
        open_item = Gtk.MenuItem("Open")
        filemenu.append(open_item)
        quit_item = Gtk.MenuItem("Quit")
        quit_item.connect("activate", Gtk.main_quit)
        filemenu.append(quit_item)

        # Append the rest of the items to the menubar
        menubar.append(file_item)

        vbox.pack_start(menubar, False, False, 0)

        # Create a label to show the content area (for example purpose)
        self.label = Gtk.Label("Hello, this is the content area!")
        vbox.pack_start(self.label, True, True, 0)

# Initialize and run the application
win = MenuExampleWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

在这个例子中:
- 我们创建了一个窗口类`MenuExampleWindow`来包含菜单的逻辑。
- 使用`Gtk.MenuBar`, Gtk.Menu, 和 Gtk.MenuItem来创建菜单条和其子菜单项。
- 连接了"Quit"菜单项的"activate"信号到`Gtk.main_quit`函数以便退出程序。
要运行此代码,保证已经安装了Python和PyGObject。在Linux系统上,通常可以使用包管理器来安装PyGObject。例如,在Ubuntu上,可以使用以下命令安装:

sudo apt-get install python3-gi python3-gi-cairo gir1.2-gtk-3.0

在Windows上,可能需要使用MSYS2或其他方式来安装GTK和PyGObject,具体的安装步骤可能会比较复杂,需要下载GTK的编译版本或使用适当的包管理器来安装。

GTK+原本是用C语言开发的,它是一套用于创建图形用户界面(Graphical User Interface, GUI)的多平台工具集,最初由GIMP项目开发,后来成为GNOME桌面环境的一部分。由于GTK+的可移植性和开放性,它已经被绑定到许多其他编程语言中,包括Python、C++、Perl、Ruby等。
使用Python作为创建GTK+窗口的语言有几个好处:
1. 简洁性:Python语法简单明了,使得创建GUI变得更加直观和快速。
2. 开发效率:Python作为一种解释性语言,允许快速迭代和调试,有利于提高开发效率。
3. 广泛的应用:因为Python的普及,很多开发者更倾向于使用Python来快速搭建原型和实现应用程序。
4. 强大的社区支持:Python社区庞大,这意味着在开发过程中遇到问题时容易得到支持。
基于以上原因,许多开发者在开发GTK+应用时选择了Python。PyGObject是Python的一个库,它为GTK+提供了Python绑定,使得Python开发者能够使用纯Python代码创建和运行GTK+应用程序。

但如果需要或偏好在C语言中使用GTK+,完全可以使用C语言来实现。以下是C语言的例子,展示如何创建带有菜单的GTK+窗口:

二、用C

示例1

#include <gtk/gtk.h>

static void activate(GtkApplication *app, gpointer user_data) {
    GtkWidget *window;
    GtkWidget *menubar;
    GtkWidget *file_menu;
    GtkWidget *file_menu_open;
    GtkWidget *file_menu_quit;
    GtkWidget *file_menu_item;

    window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Menu Example");
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);

    // Create a MenuBar and a Menu
    menubar = gtk_menu_bar_new();
    file_menu = gtk_menu_new();

    // Create a file menu and add it to the menubar
    file_menu_item = gtk_menu_item_new_with_label("File");
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_menu_item), file_menu);
    gtk_menu_shell_append(GTK_MENU_SHELL(menubar), file_menu_item);

    // Add Open & Quit items to the file menu
    file_menu_open = gtk_menu_item_new_with_label("Open");
    gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), file_menu_open);

    file_menu_quit = gtk_menu_item_new_with_label("Quit");
    g_signal_connect_swapped(file_menu_quit, "activate", G_CALLBACK(g_application_quit), G_OBJECT(app));
    gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), file_menu_quit);

    // Assemble everything and show
    gtk_container_add(GTK_CONTAINER(window), menubar);
    gtk_widget_show_all(window);
}

int main(int argc, char **argv) {
    GtkApplication *app;
    int status;

    app = gtk_application_new("org.example.menubar", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);

    status = g_application_run(G_APPLICATION(app), argc, argv);
    g_object_unref(app);

    return status;
}

编译:

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

在这个C语言版本的例子中,我们创建一个`GtkApplication`,然后在`activate`回调中构建窗口和菜单。菜单项("Open"和"Quit")被添加到文件菜单中,"Quit"菜单项连接了一个`g_application_quit`信号,当该菜单项被激活时,应用程序将退出。
选择使用哪种语言创建GTK+程序取决于个人或项目需求,每种语言的绑定都提供了基本一致的GTK+功能。

示例2

#include <gtk/gtk.h>

// 事件处理函数
static void activate(GtkApplication *app, gpointer user_data) {
    GtkWidget *window;
    GtkWidget *menu_bar;
    GtkWidget *menu_item;
    GtkWidget *file_menu;
    GtkWidget *file_menu_open;

    // 创建窗口
    window = gtk_application_window_new(app);
    gtk_window_set_title(GTK_WINDOW(window), "Window with Menu");
    gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);

    // 创建菜单栏
    menu_bar = gtk_menu_bar_new();
    menu_item = gtk_menu_item_new_with_label("File");
    gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), menu_item);
    
    // 创建'File'菜单的内容
    file_menu = gtk_menu_new();
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), file_menu);

    // 添加'Open'菜单项
    file_menu_open = gtk_menu_item_new_with_label("Open");
    gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), file_menu_open);

    // 创建盒子,将菜单栏放在上边,其余部分放下边
    GtkWidget *vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
    gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 0);

    // 添加盒子到窗口
    gtk_container_add(GTK_CONTAINER(window), vbox);

    // 显示所有窗口组件
    gtk_widget_show_all(window);
}

int main(int argc, char **argv) {
    GtkApplication *app;
    int status;

    // 创建GTK应用
    app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);
    g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
    
    // 运行应用
    status = g_application_run(G_APPLICATION(app), argc, argv);
    
    // 退出应用
    g_object_unref(app);

    return status;
}

编译:

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

pkg-config 工具用于获取GTK+ 3库的C标志和链接标志。

这将启动GTK窗体程序,显示一个菜单栏位于窗口上方的窗口。其中“File”菜单包含一个“Open”子菜单项。请注意,示例代码中的菜单并没有绑定实际的功能。如果需要让菜单项响应动作,您需要实现相应的回调函数并将其与菜单项的信号关联起来。

三、相关链接:

https://blog.csdn.net/eidolon_foot/article/details/135330336?spm=1001.2014.3001.5502

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

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

相关文章

在CMake中自定义宏 add_definitions(-DDEBUG)

hehedalinux:~/Linux/loveDBTeacher-v6$ tree . ├── CMakeLists.txt └── test.c0 directories, 2 files hehedalinux:~/Linux/loveDBTeacher-v6$ test.c #include <stdio.h> #define NUMBER 3int main() {int a 10; #ifdef DEBUGprintf("我是一个程序猿,我…

物联网介绍

阅读引言&#xff1a; 本文从多方面叙述物联网的定义以及在物联网当中的各种通信的介绍。 一、物联网的定义 1.1 通用的定义 物联网&#xff08;Internet of Things&#xff0c;IOT&#xff1b;也称为Web of Things&#xff09;是指通过各种信息传感设 备&#xff0c;如传感器、…

docker 安装redis (亲测有效)

目录 1 安装 1 安装 1 将redis 的 tar 包 上传到服务器 上传之后tar 包&#xff0c;将他变成镜像 输入docker images,发现目前是没有镜像的&#xff0c;现在将tar 包变成镜像 docker load -i redis.tar以上就将tar 包变成镜像了 现在在宿主机找一个地方&#xff0c;存放数据…

【Maven】003-基于 IDEA 创建 Maven 工程

【Maven】003-基于 IDEA 创建 Maven 工程 文章目录 【Maven】003-基于 IDEA 创建 Maven 工程一、关于 Maven 工程的 GAVP1、GAVP 简介2、GAV 坐标规范3、Packaging 定义规则 二、基于 IDEA 创建 Maven 工程1、创建 Maven 项目2、创建结果3、项目结构说明 一、关于 Maven 工程的…

机器人技能学习-构建自己的数据集并进行训练

概要 若想训练自己的场景&#xff0c;数据集的重要性不做过多赘述&#xff0c;下面就基于 robomimic 和 robosuite 构建自己的数据集进行讲解&#xff0c;同时&#xff0c;也会附上 train 和 run 的流程&#xff0c;这样&#xff0c;就形成了闭环。 自建数据集 采集数据 采…

linux安装系统遇到的问题

这两天打算攻克下来网络编程&#xff0c;发现这也确实是很重要的一个东西&#xff0c;但我就奇了怪了&#xff0c;老师就压根没提&#xff0c;反正留在我印象的就一个tcp/ip七层网络。也说正好&#xff0c;把linux命令也熟悉熟悉&#xff0c;拿着我大一课本快速过过 连接cento…

【踩坑】flask_uploads报错cannot import name ‘secure_filename‘

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 截至目前&#xff0c;用新版的flask实现文件上传(用到flask_uploads库)&#xff0c;会出现这个问题。 问题原因 版本问题&#xff0c;新的werkzeug已经把secure_filename的位置改了。 解决方法 手动修改…

数据结构与算法(十一) 排序算法一

int nArray[] { 8,5,3,2,7 };如下一个数组&#xff0c;现对其进行从小到大排序 选择排序 选择排序&#xff1a;将小的依次放在前面 具象化如下&#xff1a; void swap(int *nSValue,int *nDValue) 交换函数 { int nTempValue 0; nTempValue *nSValue; *nSVal…

RocketMQ5-03RocketMQ-Dashboard和Java客户端访问示例

接上篇02快速部署RocketMQ5.x(手动和容器部署) 已经完成 RocketMQ5.0 环境的部署&#xff0c;就需要对这个环境进行测试&#xff0c;查看集群、写入消息、读取消息等 本篇教你如何使用和查看部署的服务&#xff1a; Docker部署 Dashboard 获取镜像并下载部署服务 客户端连接 …

ZooKeeper初探:分布式世界的守护者

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 ZooKeeper初探&#xff1a;分布式世界的守护者 前言Zookeeper的概述分布式系统中的角色和作用&#xff1a; Zookeeper的数据模型Znode的概念和层次结构&#xff1a;Znode的类型和应用场景&#xff1a;…

anoconda 安装报错

表现形式&#xff1a;Output folder: D:\anoconda\Lib Extract: _nsis.py Extract: _system_path.py Output folder: D:\anoconda........................ 解决办法&#xff1a; 网址&#xff1a;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Sour…

【LabVIEW FPGA入门】使用数字IO卡实现计数器输入功能

方法1&#xff1a; 1.首先需要用一个数字IO的输入FPGA端口&#xff0c;并将其拖入程序框图中&#xff0c;同时创建一个循环。 2.如果想要在循环中实现累加功能&#xff0c;就可以使用移位寄存器。 数字输入的当前值和历史值进行比较&#xff0c;用于一个判断大于&#xff0c;来…

【论文解读】SiamMAE:用于从视频中学习视觉对应关系的 MAE 简单扩展

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://siam-mae-video.github.io/resources/paper.pdf 项目主页&#xff1a;https://siam-mae-video.github.io/ 1.背景 时间是视觉学习背景下的一个特殊维度&#xff0c;它提供了一…

年终关账四大财务处理技巧|柯桥会计做账,财税知识

2023年即将落下帷幕&#xff0c;无数公司最忙碌就是“年终关账“这件事了。 “年终关账”不仅是企业内部结算一年经营结果的事&#xff0c;还与企业所得税汇算清缴息息相关&#xff0c;甚至还可能关乎企业税负高低与企业是否依法纳税&#xff0c;千万不可小觑。 同时&#xff0…

MySQL 管理端口

错误 客户出现 MySQL连接数 超过 最大连接数的现象 ERROR 1040 (HY000): Too many connections 出现该现象&#xff0c;一般的解决方法&#xff1a; 1.修改配置文件中的最大连接数&#xff0c;之后重启数据库 2.如果配置文件中没有设置 连接超时时间的参数。8小时后&#…

平衡小车——编码器

学习目标 了解编码器的构成理解编码器采样原理掌握编码器获取转速信息学习内容 编码器组成 左侧的减速齿轮中间的电机部分右侧的电路板减速齿轮 将电机转速通过齿轮按照一定比例进行降速。 电路板 电路板中,包含了一个圆形磁体,还有两个霍尔传感器。 电机转动时,圆形的磁…

Spring之AOP源码(一)

文章目录 一、动态代理1. 概念2. Cglib动态代理的使用3. JDK动态代理的使用 二、SpringAOP1. 简介2. Spring AOP使用 一、动态代理 1. 概念 动态代理&#xff08;Dynamic Proxy&#xff09;是一种在运行时动态生成代理对象的技术。它是一种设计模式&#xff0c;用于在不修改原…

安卓手机变iOS!

Launcher iOS 16 - 安卓手机秒变iOS Launcher iOS 16 是一款iOS启动器&#xff0c;可以将安卓手机桌面变成iOS样子&#xff0c;还有iOS的开机动画和景深效果&#xff01; 下载链接&#xff1a;【Launcher iOS 16】 ​

【CCNet】《CCNet:Criss-Cross Attention for Semantic Segmentation》

ICCV-2019 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method5 Experiments5.1 Datasets and Metrics5.2 Experiments on Cityscapess5.3 Experiments on ADE20K5.4 Experiments on COCO 6 Conclusion&#xff08;own&#xff09; 1 Ba…

也谈人工智能——AI科普入门

文章目录 1. 科普入门人工智能的定义人工智能的类型 - 弱 AI 与强 AI人工智能、深度学习与机器学习人工智能的应用和使用场景语音识别计算机视觉客户服务建议引擎数据分析网络安全 行业应用人工智能发展史![img](https://img-blog.csdnimg.cn/img_convert/66aeaaeac6870f432fc4…