Linux下的GTK图形界面编程

GTK(原名)最初是GIMP的专用开发库(),后来发展为Unix-like系統下开发图形界面的应用程序的主流开发工具之一。 GTK(原名)最初是的专用开发库(),后来发展为系統下开发的应用程序的主流开发工具之一。GTK是,并且是GNU计划的一部分。自2019年2月6日起,GTK+改名为GTK。是展示GTK +版本3中許多GUI小示例的集合。 阅读详情

GTK(GIMP Toolkit)是一个图形用户编程的接口工具。它注册完全免费,所以用来开发自由软件或商业软件都不需要花费什么。现在很多Linux集成系统都已经将GTK1.2版本打包进去了。包括RedHat Linux 6.0以上版本,还有中文化的Turbo Linux等等。它也越来越被普遍的应用于UNIX系统编程。

还有一个组件叫Glib,它包含了一些标准应用的新扩展用来提高GTK的兼容性。用于Linux系统的某些函数可能不适合标准的UNIX系统,例如g_strerror()函数等等。某些函数也扩展了GNUC的一般功能,例如g_malloc函数就有自己加强的调试功能。

GTK可以与多种语言绑定,包括C++, Guile, Perl, Python, Ton, Ada95, Objective C, Free Pascal, Eiffel。用标准C开发的程序,编译软件可用GNU并附带上GTK选项即可。想用除了标准C以外的其它语言来开发Xwindow图形用户程序,则需要先参考一下有关绑定软件的内容(HTTP:// www.gtk.org)。 如果用C++语言来调用GTK进行开发,可以用已经和C++绑定的软件叫GTK--软件,来提供一个比GTK更好的C++编译环境。

目前已经开发出来GTK的增强版GTK+。GTK+是将GTK,GDK,GLIB集成在一起的开发包,可以工作在许多类似于UNIX的系统上,没有GTK的平台限制。

1.GTK的消息处理机制

下面我们先看一个基本的例子,该例子产生一个200×200像素的窗口。它不能自己退出,只能通过shell来杀死进程(调用kill命令)。

/*例子 base.c */

#include <gtk/gtk.h>

int main( int argc,char *argv[ ] ){

GtkWidget *window;

gtk_init (&argc, &argv); /* 初始化显示环境 */

window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* 创建一个新的窗口*/

gtk_widget_show (window); /*显示窗口*/

gtk_main (); /*进入睡眠状态,等待事件激活*/

return(0);

}

编译时不要忘了添加 :‘`pkg-config gtk+-2.0 --libs --cflags`’
编译时不要忘了添加??
从上面的程序可以看出,GTK是一个事件驱动工具包,当它运行到gtk_main()函数时会自动睡眠,直到有事件发生,控制权转让给相应的函数调用,在该函数中可以用标准C写出相应的事物逻辑。这与windows 上的程序处理是一样的。

对窗口对象上发生的事件(如按下鼠标,激活键盘等),GTK也有相应的消息信号产生。这时就需要程序员创建一个信号处理器来捕获该信号,并告诉GTK程序事件发生后调用哪个回调函数。信号处理器的创建函数定义如下:

gint gtk_signal_connect( GtkObject *object, gchar *name,

GtkSignalFunc callback_func, gpointer func_data );

返回值是一个区分同一对象中的事件与不同回调函数的关联标签。这样可以做到一个对象的一个信号就有任意多个回调函数,并且每一个都会按照声明的顺序执行。函数调用的第一个参数是产生信号的widget组件(即按钮等窗口构件),而name则是希望捕获的信号或事件的名称,callback_func则是事件发生后所调用的回调函数名称,而第四个参数func_data则是传递给回调函数的参数。

回调函数要定义在主程序的前面,它们的一般格式都如下所示:

void callback_func( GtkWidget *widget, gpointer func_data );

调用下面这个方法将允许你将回调函数与事件的关联断开:

void gtk_signal_disconnect( GtkObject *object, gint id );

该函数的第二个参数就是上述gtk_signal_connect()函数的返回值,即关联标签。第一个参数指向了去除关联的对象名称。这样可以做到断开事件与回调函数的关联,使得事件发生后,不会调用相关的回调函数。

布局格式


2.1打包盒子

对GTK显示格式的控制是通常通过打包盒子来完成的。widget组件打包可以采用两种方式,水平盒子和垂直盒子。若将widget组件打包进平行盒子,组件就被依次水平的插入窗口;若是垂直盒子,则组件排列是垂直的。产生新的水平盒子的函数为

GtkWidget *gtk_hbox_new (gint homogeneous, gint spacing);

参数homogeneous是用来控制是否盒子中的每个组件都有同样的大小(例如水平盒子中的控件有同样的宽度,垂直盒子中的控件有同样的高度)。Spacing参数是组件之间的间隔。

垂直盒子的创建函数是gtk_vbox_new(),定义与水平盒子一致。

gtk_box_pack_start()和gtk_box_pack_end()函数是用来将打包对象放入这些盒子中的。

void gtk_box_pack_start( GtkBox *box, GtkWidget *child,

gint expand, gint fill, gint padding );

第一个参数是你将组件打进去的盒子指针,第二个参数是你将要打进去的组件指针。Expand参数是用来控制是否允许组件扩展至分配给盒子空间的大小(选TRUE),还是盒子的大小收缩到组件那么大(选FALSE)。函数中的fill参数是用来控制是否将多余的空间分配给组件,即将组件扩展到盒子的大小(选TRUE),或者多余的空间不变,保留作为盒子和打包组件间的间隔。该参数只有在expand参数取TRUE时才有效。Padding参数是指组件四周与盒子的间隔大小。

注意fill取FALSE值,expand取TRUE值时与expand取FALSE值,fill值无效的区别。前者的盒子仍是原来创建盒子时指定的大小,而后者的盒子已经缩小到打包组件的大小了。

gtk_box_pack_end()函数的参数与上面描述的一致。只是排列顺序分别是从下到上,从右到左。

最后将所有的盒子或组件打包到一个大盒子中,用gtk_container_add()函数将盒子加入窗口即可。

2.2表格打包

我们可以产生一个表格,将widget组件一一放入。Widget组件将占据所有分配给它的空间。创建表格是用下面的函数:

GtkWidget *gtk_table_new( gint rows, gint columns,

gint homogeneous );

第一个参数,显而易见,是表格的行数。后面的参数则是表格的列数。homogeneous参数则是用来安排表格间隔大小。如果它取TRUE,则表格中每个小格的大小用表格中最大组件的大小来设置的,所有的小格大小都是一样的。如果homogeneous参数取FALSE的,每个小格的大小都用同行中最高组件的高度,同列中最宽组件的宽度。

将一个widget组件放入一个表格,用下面的函数:

void gtk_table_attach( GtkTable *table, GtkWidget *child, gint left_attach,

gint right_attach, gint top_attach, gint bottom_attach,

gint xoptions, gint yoptions, gint xpadding, gint ypadding );

left_attach参数和right_attach参数将指出在哪儿放置组件,以及用了多少盒子。如果你想在两行两列的表格中的右下小格中加入一个按钮,并且想让按钮充满那个小格,则参数可以选择left_attach = 1, right_attach = 2, top_attach = 1, bottom_attach = 2。其实left_attach也就是组件所在小格的左边框是表格的第几条边数,其它依此类推。

参数xoptions和yoptions是用来确定打包选项的,可以用OR来选择多个选项。

调节器
GTK有很多组件可以用鼠标或键盘来调整,例如范围组件(Range Widget)。还有一些组件在整个数据区域的一部分是可调整的,例如文本组件(Text Widget)和视口组件(Viewport Widget)。

很明显,程序是要能够对可调整组件所产生的变化进行处理。一种解决办法是让可调整组件在释放自己的信号时,将调整数据值传递信号处理器。或者用另外一种解决方法将调整数据值放入一个数据结构,由程序访问该结构来获得改变的参数值。有时候你可能需要将几个可调整组件的调节相关联,调整一个也会导致另一个的变化。最明显的例子就是滚动条与文本编辑框组件的处理。如果这些相关联的组件分别有自己处理调整数据的方法,则程序员必须自己写一个信号处理器,将一个组件的调整数据转换成另一个组件的调整数据,并调用调整设置函数将该值设置进去。

GTK调用了调节器成功的解决了这个问题。调节器不是组件,而是存储和传递调整数据的结构。最典型的调整器应用是存储配置参数和范围组件的值。不同的是调整器也是从对象(Object)继承而来的,它有许多不同于数据结构的特性。最重要的是,它也会释放信号,并且这些信号不仅可以被程序捕获来响应用户的调整和编辑,还可以在可调整组件中透明的传播调整数据。

一般调节器会创建组件时自动创建。例如让文本组件和滚动条组件用同一个调节器如下所示:

text = gtk_text_new (NULL, NULL);

/* 将刚创建的调节器用于垂直滚动条 */

vscrollbar = gtk_vscrollbar_new (GTK_TEXT(text)->vadj);

调节器是从对象Object继承下来的。所以它与其它的组件对象一样,能够产生信号。当好几个组件共享一个调节器时,它们都会和一个信号处理器相关联。这个信号处理器是用来处理“value_changed”信号的,跟程序中处理信号是一样。下面是在GtkAdjustmentClass结构中该信号的定义:

void (* value_changed) (GtkAdjustment *adjustment);

不同的可调整组件都用一个调节器时,任何一个组件发生调整变化都会产生该信号。有两种情况会导致这个现象的发生。第一种情况是用户在用鼠标或键盘调整该组件(例如拉滚动条),或者直接在程序中用gtk_adjustment_set_value()函数来改变调节器中的value值。

当调节器的upper参数和lower参数被重新配置时,就象用户需要给一个文本编辑框加入了更多的文本后,调节器就会释放出“changed”信号。它的定义如下:

void (* changed) (GtkAdjustment *adjustment);

范围组件将该信号与一个信号处理器相关联,并随时在面板上反映参数的变化。举个例子,滚动条中滑动键的大小与调节器中upper,lower值之差正好成反比。一旦前者有任何改变,面板上的显示也会相应产生变化。

不需要在程序中将一个信号处理器与该信号相关联,一切都是GTK完成的。如果你直接设置了调节器的这些参数,则需要在程序中调用下面的语句来释放信号:

gtk_signal_emit_by_name (GTK_OBJECT (adjustment), "changed");

创建组件小结
从上面可看出,创建一个widget组件可以用以下几个步骤完成:

gtk_*_new()—调用一个非常有用的函数来产生一个新的widget组件。


4.2用gtk_box_pack_start()函数连接所有的信号和事件,产生相应的事件处理器来调用回调函数。

4.3设置widget组件以及调节器的特性。

4.4用合适的函数将widget组件打包到一个容器(盒子或表格)中,例如gtk_box_container_start()函数或者gtk_container_add()函数等。

4.5用gtk_widget_show()函数来显示组件。

用上述方法可创建出程序员所需要的任意窗口构件,再将容器打入窗口并显示窗口之后,程序便进入主循环睡眠状态,主程序编制也就结束了。事件的处理逻辑放到回调函数中编制。

编译程序用下面的命令:

gcc my_prog.c –o my_prog.o –lgtk –lgdk ↙

完成后在Xwindow环境下运行my_prog.o程序即可。



目前X窗口(Xwindow)和GNU编译系统已成为应用linux或unix操作系统的计算机工作站和大型计算机上最主要的图形用户界面系统,在微机上也有广泛应用。而GTK正是两者结合的编程开发包。它比以往用的Xwindow/Motif编程更为简单方便,功能也很强大,有着较好的应用前景。目前网上已经有很多利用该软件包开发出来的自由发布软件,极大的丰富了Linux平台的应用。

作者:Vic Wong的小屋

Linux图形界面编程简单教程(附计算器源代码) 阅读详情

相关推荐

Linux下GTK开发的初始配置和编程指南

GTK是一种广泛使用的图形用户界面(GUI)工具包,它提供了一套用于创建跨平台应用程序的工具和库。在Linux环境下进行GTK开发需要进行一些初始配置和编程操作。本文将详细介绍这些步骤,并提供相应的源代码示例。通过以上步骤,您已经了解了在Linux下进行GTK开发的初始配置和编程操作。您可以根据需要添加更多的GTK组件和功能,以构建出丰富的用户界面。在上面的示例中,我们创建了一个按钮,并连接了一个回调函数。当按钮被点击时,回调函数将被调用,并打印一条消息。一个简单的GTK窗口将显示在屏幕上。

git_web425的博客 906

gtk学习总结:GTK从入门到放弃,三天包教包会

今天花了一些时间复习之前学习过的gtk,感觉东西光学不用忘得好快啊,在这做个之前学过的内容的备份,希望对大家有用,也希望大家不要从入门到放弃。文中有些代码例子可能来自《GTK从入门到精通》吧,我不记得了,或者叫《GTK中文教程》,忘记了,总之,这是一个学习笔记,希望不触及任何人的利益,起到共享学习之用。 目录 编译方法 编译脚本 01.一个简单的按钮 02.两个按钮 03.vbox:一...

RToax 4万+

Linux 桌面系统编程:利用GTK库创建图形界面应用程序

Linux 桌面系统编程:利用GTK库创建图形界面应用程序在 Linux 桌面环境中,编写图形界面应用程序是一种常见的需求。为了创建这样的应用程序,我们可以使用 GTK (GIMP Toolkit) 库。GTK 是一个开源的工具包,它提供了一套用于创建用户界面的函数和工具。本文将介绍如何使用 GTK 库来编写 Linux 桌面系统的图形界面应用程序,并提供相应的源代码示例。

TechCraze的博客 1194

GTK入门教程

GTK(GIMP Toolkit)是一套源码以LGPL许可协议分发、跨平台的图形工具包。最初是为GIMP写的,已成为一个功能强大、设计灵活的一个通用图形库,是GNU/Linux下开发图形界面的应用程序的主流开发工具之一。当然,GTK也是支持跨平台的,支持Unix类的系统、Windows,甚至手机平台。

weixin_44453694的博客 9851

GTK图形界面编程:用C语言实现Linux登录界面

在现代软件开发中,用户界面(UI)是用户与软件进行交互的桥梁,GTK(GIMP Toolkit)库作为一个强大的图形工具包,广泛用于Linux平台下的跨平台GUI开发。它提供了一套完整的控件,用于创建复杂的窗口和对话框,拥有高度的可定制性和良好的扩展性。回调函数是一个用户定义的函数,它由信号触发。在GTK中,当特定的事件发生时,GTK会调用相应的回调函数。用户必须提供这些函数的实现,并在信号与回调函数之间建立连接。

weixin_35750483的博客 1065

【Nordic实战】nRF54L15引脚规划:电源域、专用引脚与低功耗设计避坑指南

本文深入解析Nordic nRF54L15芯片的引脚规划策略,重点阐述其基于电源域(MCU域、PERI域、LP域)的GPIO分配原则。文章提供了从思维转变到实战避坑的完整指南,强调遵循专用引脚与域对应关系是实现超低功耗设计的关键,并分享了系统化的引脚规划流程与工具使用建议。

weixin_29192141的博客 318

linux下怎么图形编程软件,Linux下的GTK图形界面编程

内容介绍原文档由会员 xiaowei 发布Linux下的GTK图形界面编程7600多字 8页摘 要:本文介绍了Linux平台下的Xwindow图形窗口编程工具GTK,并给出了用GTK编程的基本要素和步骤。关键词:GTK,回调函数,消息处理器,调节器The GTK graphical programming interface in LinuxAbstract: The introduced...

weixin_42361666的博客 435

TwinCAT3入门教程3——PLC程序变量定义和硬件IO关联

目录 1、IO输入输出变量定义和硬件关联 1.1 IO输入 1.2 IO输出 1.3 PLC变量和IO模块关联 1.4 测试IO输出点 2、伺服变量关联 1、IO输入输出变量定义和硬件关联 1.1 IO输入 添加全局变量IO_Global 变量定义 (*==========================================IO输入===============================================================*)

panjinliang066333的博客 1万+

关于GTK -- Linux下的GTK图形界面编程

http://reciteword.cosoft.org.cn/yaoguang/或者http://forlinux.yeah.net/里面有些GTK的资料可以看看.---------------------------------------------------------------------------------------------------------------------

时光机器 2307

【外挂编程】外挂编程技术揭秘(二)

引言: 经过上一篇文章大家可能对外挂有了一个初步的认识,之前的内容比较简单,应该大家很容易掌握。我写作过程中我发现三个篇幅可能写不完,后续还可能要多加几个篇幅,这篇我们就先以内存挂为主吧。话不多说了,让我们开始吧。 文章中代码github地址: https://github.com/Diamonds-ZhaoYu/hz_example 环境要求: 系统:Windows 语言...

c-rain 4032

MATLAB联合Fluent优化仿真

matlab与fluent交互

keleke_的博客 4722

Linux下的GTK图形界面编程(转)

Linux下的GTK图形界面编程(转)[@more@]苏洁 王京林 周东方(中国人民解放军信息工程大学) 【摘要】 本文介绍了Linux平台下的Xwindow图形窗口编程工具GTK,并给出了用GTK编程的基本要素和步骤。 【关键...

csobhtdx34120的博客 1230

Maya vray 3S皮肤材质球设置与材质节点连接

Maya vray 3S皮肤材质球设置与材质节点连接

WETQETF的博客 2697

Linux操作系统下的GTK图形界面编程方法

<br />GTK(GIMP Toolkit)是一个图形用户编程的接口。它完全免费,所以用来开发自由软件或商业软件都不需要花费什么。现在很多Linux集成系统都已经将 GTK1.2版本打包进去了。包括RedHat Linux 6.0以上版本,还有中文化的Turbo Linux等等。它也越来越被普遍的应用于UNIX系统编程。<br />还有一个组件叫Glib,它包含了一些标准应用的新扩展用来提高GTK的兼容性。用于Linux系统的某些函数可能不适合标准的UNIX系统,例如g_strerror()函数等等。某些

林学森的技术专栏 1470

AI计算,为什么要用GPU?

几年后,2012年,神经网络之父杰弗里·辛顿(Geoffrey Hinton)的两个学生——亚历克斯·克里切夫斯基(Alex Krizhevsky)、伊利亚·苏茨克沃(Ilya Sutskever),利用“深度学习+GPU”的方案,提出了深度神经网络AlexNet,将识别成功率从74%提升到85%,一举赢得Image Net挑战赛的冠军。根据形态,GPU可分为独立GPU(dGPU,discrete/dedicated GPU)和集成GPU(iGPU,integrated GPU),也就是常说的独显、集显。

经营范围: CTA、SRRC、CCC、移动、电信、联通入库 1675

FAST-LIVO2 源码精读(五):IMU 运动模型、离散传播与去畸变原理

本文是「FAST-LIVO2 激光-惯性-视觉里程计源码精读」专栏第五篇,数学基础篇章(第 4–7 篇)的第二篇。上一篇在 SO(3) 流形上建立了姿态表示与右扰动模型;本篇聚焦 IMU 预积分的核心问题:一帧激光扫描横跨约 100 ms,帧内每一个点的采集时刻各不相同,如何利用 200 Hz 的 IMU 量测将全帧点云统一对齐到帧末时刻?答案完整封装在(587 行)的函数中,本篇逐段拆解其四阶段逻辑,并推导协方差矩阵随误差状态转移矩阵F_x逐帧演化的物理含义。

PX4-SLAM-PNC 156

Linux操作系统下的GTK图形界面编程方法(转)

<br />Linux操作系统下的GTK图形界面编程方法<br />http://os.51cto.com  2007-10-08 11:41  kit  赛迪网  我要评论(0)<br />摘要:GTK(GIMP Toolkit)是一个图形用户编程的接口。它完全免费,所以用来开发自由软件或商业软件都不需要花费什么。现在很多Linux集成系统都已经将GTK1.2版本打包进去了...<br />标签:Linux  GTK  图形界面编程<br />GTK(GIMP Toolkit)是一个图形用户编程的接口。它

lieye_leaves的专栏 1450

华为OD机试真题 新系统2026-04-08 Python&JS 实现【配置操作失败数量统计】

模拟一个系统的命令行配置,包含添加、修改、删除三项操作,详情如下: 添加操作命令:add_rulerule_id=1rule_index = 18 修改操作命令: mod_rule rule_id= 1rule_index = 100 删除操作命令:del_rulerule_id=1

MISAYAONE的博客 586

Ubuntu下安装GTK

毕业设计需要用到Linux下的图形界面开发,就我所知,图形库除了GTK还有QT,为了统一,我们小组都使用GTK来做图形界面的开发,安装过程很简单,这里稍作记录。   ---------------------------------------- 华丽的分割线 ---------------------------------------------- GTK介绍:(摘自百度百科)    

nedushy123的专栏 825

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

GTK入门

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object classid

欲穷千里目,更上一层楼 1773

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 关于linux图形界面编程基本知识
下一篇: 动态IP访问控制列表解析
linuxchyu
博客等级 码龄17年 28粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值