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

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

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

相关文章

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 文件 修改成…

SpringCloud:微服务

文章目录 微服务服务架构演变单例架构&#xff08;集中式架构&#xff09;分布式架构 微服务SpringCloud 微服务 服务架构演变 单例架构&#xff08;集中式架构&#xff09; 单例架构&#xff1a; 将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署 优点&…

RK3568笔记八: Display子系统

modetest 是由 libdrm 提供的测试程序&#xff0c;可以查询显示设备的特性&#xff0c;进行基本的显示测试&#xff0c;以及设置显示的模式。 我们可以借助该工具来学习 Linux DRM 应用编程&#xff0c;另外为了深入分析 Rockchip DRM driver&#xff0c;有必要先了解一下这个…

设置了uni.chooseLocation,小程序中打不开

设置了uni.chooseLocation&#xff0c;在小程序打不开&#xff0c;点击没反应&#xff0c;地图显现不出来&#xff1b; 解决方案&#xff1a; 1.Hbuilder——微信开发者工具路径没有配置 打开工具——>设置 2.微信小程序服务端口没有开 解决方法&#xff1a;打开微信开发…

宝塔面板使用phpMyAdmin 502 Bad Gateway

第一步软件商店安装PHP 第二步设置phpMyAdmin,选择PHP版本 – 解决

浅谈电动机监控系统在企业降碳过程中的作用 ——安科瑞 顾烊宇

1.前言 据《2017-2022年中国电力工业产业专项调查及十三五市场商机分析报告》显示&#xff0c;从我国目前全社会用电结构来看&#xff0c;工商业用户耗电量约占 80%&#xff0c;其中电机耗电约占工业用电的 75%&#xff0c;全国总耗电的 60%&#xff0c;是用户终端耗电占比较大…

系列六、Spring Security中的认证 授权 角色继承

一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权&#xff0c;请参考【系列一、认证 & 授权】&#xff0c;这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…

flutter 打包安卓apk 常用配置

打包之前需要先不配置不然会报错 Execution failed for task ‘:app:mergeReleaseResources’. APP目录下的build.gradleaaptOptions.cruncherEnabled falseaaptOptions.useNewCruncher false如图 配置targetSdkVersion 、minSdkVersion 在android/app/src目录下的build.…

java数据结构与算法:单链表 SinglyLinkedList

单链表 SinglyLinkedList 创建实现类并实现方法 package com.lhs;public class SinglyLinkedList<E> implements List<E>{// 头节点private Node<E> first;// 尾节点private Node<E> last;// 节点数量private int size;public static class Node<…

VMware workstation安装debian-12.1.0虚拟机并配置网络

VMware workstation安装debian-12.1.0虚拟机并配置网络 Debian 是一个完全自由的操作系统&#xff01;Debian 有一个由普罗大众组成的社区&#xff01;该文档适用于在VMware workstation平台安装debian-12.1.0虚拟机。 1.安装准备 1.1安装平台 Windows 11 1.2软件信息 软…

【时事篇-03】20240113棋盘麦粒的问题 (黑白棋盘填入不同色彩文字,2的次方、sum法)

作品展示&#xff1a; 背景需求 棋盘麦粒的每个棋盘格子里有多少麦粒呢&#xff1f;64格一共需要多少麦粒 用Python写一个答案吧 项目:棋盘麦粒The grain problem 2的次方 sum() 作者:阿夏 时间:2024年1月13日19:03在印度有一个古老的传说&#xff1a;舍罕王打算奖赏国际象棋…

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

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

大模型实战营Day4 XTuner大模型单卡低成本微调实战

FINETUNE简介 LLM下游应用中&#xff0c;增量预训练和指令跟随是经常会用到的两种微调模式 指令跟随微调 使用场景&#xff1a;让模型学会对话模板&#xff0c;根据人类指令进行对话 训练数据&#xff1a;高质量的对话&#xff0c;问答数据 为什么需要指令微调&#xff1f; 因为…

1222. 密码脱落(dp划分)

题目&#xff1a; 1222. 密码脱落 - AcWing题库 思路&#xff1a; 代码&#xff1a; #include<cstdio> #include<cstring> using namespace std; const int N1010; int f[N][N];//表示以L和R为两端点的字符串的“最长”回文序列长度 char s[N];//存储输入的字符串…

java每日一题——ATM系统编写(答案及编程思路)

前言&#xff1a; 基础语句学完&#xff0c;也可以编写一些像样的程序了&#xff0c;现在要做的是多加练习&#xff0c;巩固下知识点&#xff0c;打好基础&#xff0c;daydayup! 题目&#xff1a;模仿银行ATM系统&#xff0c;可以创建用户&#xff0c;存钱&#xff0c;转账&…

探索商超货架场景目标检测性能,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建商超货架场景下亨氏米粉食品种类检测识别系统

在前面的系列博文中&#xff0c;我们陆续应用实践开发了很多有趣的项目&#xff0c;但是在密集排布场景下如商超购物场所内货架上货物种类目标检测模型的开发我们则少有涉及&#xff0c;正值周末&#xff0c;本文的主要目的就是想要实践构建这一场景下的目标检测模型&#xff0…

QSpace:Mac上的简洁高效多窗格文件管理器

在Mac用户中&#xff0c;寻找一款能够提升文件管理效率的工具是常见的需求。QSpace&#xff0c;一款专为Mac设计的文件管理器&#xff0c;以其简洁的界面、高效的多窗格布局和丰富的功能&#xff0c;为用户提供了一个全新的文件管理体验。 QSpace&#xff1a;灵活与功能丰富的结…

MySQL面试题 | 05.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Qt打包程序

添加链接描述

Ps:何时需要转换为智能对象

智能对象 Smart Objects提供了广泛的灵活性和控制能力&#xff0c;特别是在处理复杂的合成、重复元素或需要非破坏性编辑的项目中。 ◆ ◆ ◆ 何时需要转换为智能对象 1、当需要对图像进行缩放、旋转等变换时。 涉及到的 Photoshop 命令包括&#xff1a;变换、自由变换、操控…