GNOME/GTK+GUI程序设计

时间:2022-03-20 06:56:36
X窗口系统:Linux程序设计534。
Linux中两个最受欢迎的GUI库:GNOME/GTK+和KDE/Qt。
Linux中所有的GUI库都是基于称作X窗口系统(X或X11)的底层窗口系统。
XFree86是X窗口系统的开源、*发布的克隆版本,几乎所有的Linux发行版都包含它。
实际上,Linux中桌面是一个相当模糊的概念,并没有哪个项目或组织在发布权威版本,当前主流的安装包含了各种各样的库、工具和应用程序,它们总称为“桌面”。
X窗口系统分为硬件级和应用程序级组件,分别称为X服务器和X客户端。这些组件通过使用X协议进行通信。
X服务器运行在用户的本地机器上,在屏幕上完成低层的绘图操作,X服务器是直接向显卡发送消息。X服务器通过鼠标和键盘监听用户输入,并将键盘按键和鼠标点击传输给X客户端,这些信息叫作事件,它们构成GUI编程的一个关键元素。
X客户端是以X窗口系统作为GUI的任何程序,X客户端等待X服务器传送的用户事件,然后通过给X服务器发送重绘消息来响应。
注意:X客户端不需要和X服务器运行在同一台机器上。
X客户端和X服务器之间使用X协议进行通信,这使得客户端和服务器能够在网络中分离。
Xlib库是X客户端间接用于产生X协议消息的库,它是一套API,使得X客户端可以与X服务器通信,从而让X服务器在屏幕上绘制非常基本的元素,并能响应最简单的输入。
注意:Xlib是一个非常底层的库,使用Xlib库创建菜单这样简单的东西还仍然是一个相当费力的过程,需要几百行的代码。GUI程序员不能直接通过Xlib编程,我们需要一些API使得诸如菜单、按钮和下拉列表等GUI元素能够简单方便的创建,简言之,这就是X工具包的作用。
X工具包是一个GUI库,X客户端用它极大的简化的窗口、菜单和按钮等的创建。使用工具包可以通过函数调用就能创建按钮、菜单、框架及类似的东西。诸如此类的GUI元素统称为窗口部件(weight)。
目前最流行的X工具包是GTK+和Qt,它们分别构成了GNOME和KDE桌面的基础。
X窗口管理器:Linux程序设计535.
Tcl/Tk脚步语言:Linux程序设计536。
GTK是一个库,它提供一组已制作好的称为“窗口部件”的组件,我们通过简单易用的函数调用把这些组件和应用程序逻辑组合在一起,从而极大地简化了GUI的创建。
GTK+完全是用C语言写的,但是它通过GObject库来支持对象和面向对象编程,这个库通过宏来支持继承和多态。
GTK+是建立在一个可移植的C语言库GLib上,GLib定义这些类型(如gint,gchar,gpointer)来帮助跨平台开发。GLib提供一组数据类型、函数和宏的标准替代集来进行内存管理和处理通用任务,以此来帮助跨平台开发。这些数据类型、函数和宏意味着作为GTK+程序员,我们可以确认我们的代码能可靠地移植到其他平台和体系结构上。
注意:本质上讲,GLib附加的数据类型是C语言标准数据类型的替代,以及确保跨平台字节长度不变。
GNOME是GNU Network Object Model Environment的缩写。
所有基于GTK+的GUI程序都必须在开始调用gtk_window_new(argc, &argv)来初始化GTK+库,并将命令行参数argc和argv传递给它,这样GTK+就可以解析它需要的任何命令行参数了,注意:我们必须在调用任何GTK+函数之前对其进行这样的初始化。
所有基于GTK+的GUI程序都必须在最后调用函数gtk_main(),这个关键函数通过把控制权交给GTK+开始交换过程,并且一直运行,直到调用gtk_main_quit才返回。
所有的GUI库都有一个共同点,必须有某种机制响应用户动作以执行代码。命令行程序有奢侈的做法:就是暂停执行,等待用户输入,然后采用switch语句等机制根据输入不同而分支执行。这种方法对GUI应用程序不现实,因为应用程序必须不断地响应用户输入。现代窗口系统由事件和事件监听器系统来解决这个问题,其思想是每次用户输入都触发一个事件,程序员只需编写监听事件及事件触发时执行的代码就可以了。
注意:对于基于X窗口系统的GUI程序,当用户输入时,X服务器会发出事件,但是这些事件并不能对GTK+程序员由任何帮助,因为这些事件都是非常底层的,如当用户点击了一下鼠标,X服务器发出一个包含鼠标指针坐标的事件,而GTK+程序员需要监听的是用户何时激活了一个窗口部件。这是因为这个原因,所有GTK+就必须要有自己的事件和事件监听器系统(不能直接使用XWindow的事件和事件监听器系统),叫做信号(signal)和回调函数(callback)。
GTK+信号是当某件事(如用户输入)发生时GtkObject对象发出来的数据,即负责发出信号的代码是特定窗口部件内置的。
GTK+回调函数就是一旦信号发出就会被调用的函数。
GUI的布局对其可用性来说是至关重要的,同样也是最难做好的事件之一。为了创建在所有系统中都很一致的GUI,你要避免使用绝对坐标,而是采用一种更灵活的布局系统,GTK+通过包装盒(Box)窗口部件来实现这一目标。
注意:包装盒box是不可见的窗口部件,它的作用就是包含其他的窗口部件,并且控制它们的布局。为了控制包装盒中每个窗口部件的大小,我们为它们指定规则而不是坐标。既然包装盒可以包含任何GtkWidget,而GtkBox本身就是一个GtkWidget,所以我们可以在包装盒中包含包装盒,从而创建负责的布局。
GtkWindow是所有GTK+程序的基本元素,我们用它来容纳窗口部件:Linux程序设计546。
GtkEntry是一个单行文字输入窗口部件:Linux程序设计547.
GtkSpinButton限制用户只能输入数组字符,而且可以为输入值设置上界和下界。
GtkToggleButton继承至GtkButton,除了有状态之外它与GtkButton完全一样:Linux程序设计551.
GtkCheckButton继承至GtkToggleButton,就是复选框按钮:Linux程序设计552。
GtkRadioButton继承至GtkCheckButton,就是单选框按钮:Linux程序设计552。
GtkTreeView可以创建电子表格或文件管理器中常见的数据列表和树视图:554.
GTK+被设计成独立于桌面的,也就是说,GTK并不假定它运行在GNOME上,甚至不假定它运行在Linux上。这样GTK+就可以相对容易地移植到Windows或者任何其他窗口系统上。这样的结果是GTK+缺乏将程序与桌面紧密结合的方法。
GNOME库包含GNOME窗口部件,GNOME窗口部件扩展了GTK+,并用一些更易用的窗口部件替换了GTK+的相应部分。
GtkDialog的使用:Linux程序设计563.

用GTK+创建一个窗口:Linux程序设计540。
GTK+监听事件处理的例子:Linux程序设计542。
几个具有复杂布局的GTK+窗口:Linux程序设计545。
创建一个用户名和口令输入窗口,然后将输入的口令与一个隐秘的口令相比较:Linux程序设计548。