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

一、用python

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

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtkclass 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 intovbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)self.add(vbox)# Create a MenuBar and append itemsmenubar = Gtk.MenuBar()filemenu = Gtk.Menu()file_item = Gtk.MenuItem("File")file_item.set_submenu(filemenu)# File menu itemsnew_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 menubarmenubar.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 Menumenubar = gtk_menu_bar_new();file_menu = gtk_menu_new();// Create a file menu and add it to the menubarfile_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 menufile_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 showgtk_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.mzph.cn/news/620517.shtml

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

相关文章

【软件测试】学习笔记-不同视角的软件性能与性能指标

本篇文章探讨新的测试主题&#xff1a;性能测试&#xff0c;因为性能测试的专业性很强&#xff0c;所以我会以从0到1的入门者视角&#xff0c;系统性地阐述性能测试的方法以及应用领域&#xff0c;用实例去诠释各种性能指标。 本篇文章站在全局的视角&#xff0c;帮你梳理软件性…

【Python机器学习】决策树——树的特征重要性

利用一些有用的属性来总结树的工作原理&#xff0c;其中最常用的事特征重要性&#xff0c;它为每个特征树的决策的重要性进行排序。对于每个特征来说&#xff0c;它都是介于0到1之间的数字&#xff0c;其中0代表“根本没有用到”&#xff0c;1代表“完美预测目标值”。特征重要…

【复现】网康科技-防火墙存在RCE漏洞_17

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 网康下一代防火墙(NGFW)是一款可以全面应对应用层威胁的高性能防火墙。通过深入洞察网络流量中的用户、应用和内容&#xff0c;并…

Vulnhub靶机:driftingblues 2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;driftingblues2&#xff08;10.0.2.18&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entr…

YOLOv5改进 | 注意力篇 | CGAttention实现级联群体注意力机制 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是实现级联群体注意力机制CascadedGroupAttention,其主要思想为增强输入到注意力头的特征的多样性。与以前的自注意力不同,它为每个头提供不同的输入分割,并跨头级联输出特征。这种方法不仅减少了多头注意力中的计算冗余,而且通过增…

四、Qt 的第一个demo

在上一篇章节里《三、Qt Creator 使用》&#xff0c;我们介绍了如何使用Qt Creator创建一个简单的带窗体的demo&#xff0c;在这一章节里&#xff0c;我们详细讲解一下这个demo的文件组成&#xff0c;及主函数&#xff0c;并在UI上加一些控件&#xff0c;实现一些简单的功能。 …

Qt打包程序

添加链接描述

11Spring IoC注解式开发(下)(负责注入的注解/全注解开发)

1负责注入的注解 负责注入的注解&#xff0c;常见的包括四个&#xff1a; ValueAutowiredQualifierResource 1.1 Value 当属性的类型是简单类型时&#xff0c;可以使用Value注解进行注入。Value注解可以出现在属性上、setter方法上、以及构造方法的形参上, 方便起见,一般直…

git修改历史(非最新)提交信息

二、修改最近第二次或更早之前的commit信息 当前有三次提交&#xff0c;从近到远分别为1、2、3 以修改第2次提交为例&#xff08;从最新往前数&#xff09; 1、使用命令git rebase -i HEAD~2 按i进入编辑模式&#xff0c;将对应的pick改为edit&#xff0c;然后ctrlc退出。最…

linux安装系统遇到的问题

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

survey和surveyCV:如何用R语言进行复杂抽样设计、权重计算和10折交叉验证?

一、引言 在实际调查和研究中&#xff0c;我们往往面临着样本选择的复杂性。复杂抽样设计能够更好地反映真实情况&#xff0c;提高数据的代表性和可靠性。例如&#xff0c;多阶段抽样可以有效地解决大规模调查的问题&#xff0c;整群抽样能够在保证样本的随机性的同时减少资源消…

腾讯云添加SSL证书

一、进入腾讯云SSL证书&#xff1a; ssl证书控制台地址 选择“我的证书”&#xff0c;点击"申请免费证书" 2、填写域名和邮箱&#xff0c;点击“提交申请” 在此页面中会出现主机记录和记录值。 2、进入云解析 DNS&#xff1a;云解析DNS地址 进入我的解析-记录…

QT DAY5作业

1.QT基于TCP服务器端 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QMessageBox> //消息对话框类 #include <QTcpSocket> //客户端类 #include <QList> //链表容器类namespace …

Center审计策略表安装和策略添加(事务)——(Linux/Windows版本)

本博客主要讲述Center的审计策略表安装和策略添加 使用事务添加 1、开启事务 my->StartTransaction(); 2、编写sql语句 //清除原来数据&#xff0c;防止数据污染my->Query("DROP TABLE IF EXISTS t_strategy");string sql "CREATE TABLE t_strategy (…

世微AP630X地摊灯 手电筒方案 可充电多功能LED灯

1,信息来源&#xff1a;深圳市世微半导体有限公司 Augus 2,产品的特性有&#xff1a; 全集成单芯片控制 5 照明循环模式可选 0.5A/1A 固定充电电流可选 内置 MOS 1.8A 驱动电流 可外置 MOS 驱动更大电流 充电指示/低电提示/短路提示 3A 手电筒过流保护? 预设 4.22V 电…

云原生分布式多模架构:华为云多模数据库 GeminiDB 架构与应用实践

文章目录 前言一、GeminiDB 总体介绍1.1、华为云数据库全景图1.2、GeminiDB 发展历程1.3、GeminiDB 全球分布情况 二、GeminiDB 云原生架构2.1、核心设计&#xff1a;存算分离&多模扩展2.2、存算分离&多模扩展核心优势2.3、高可用&#xff1a;秒级故障接管2.4、弹性扩展…

Sonar Qube基本使用

中文化 Sonar Qube的使用方式很多&#xff0c;Maven可以整合&#xff0c;也可以采用sonar-scanner的方式&#xff0c;再查看Sonar Qube的检测效果 Sonar-scanner实现代码检测 下载Sonar-scanner&#xff1a;https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/…

强化学习应用(六):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

【深度学习】Anaconda3 + PyCharm 的环境配置 3:GitHub 项目运行前的环境配置

前言 文章性质&#xff1a;实操记录 &#x1f4bb; 主要内容&#xff1a;主要记录了运行 GitHub 项目前的环境配置过程&#xff0c;包括创建并激活新的虚拟环境、安装 torch 和 torchvision&#xff0c;在 PyCharm 中使用新建的虚拟环境&#xff0c;根据项目源代码提供的 requi…

androidkiller的两种异常情况

第一种反编译时异常&#xff1a; Exception in thread “main” org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: cf 77 4c c7 9b 21 01 修改方法&#xff1a; 编辑 AndroidKiller 的 bin/apktool 目录下有一个 apktool.bat 文件 修改成…