Chinaunix首页 | 论坛 | 博客
  • 博客访问: 236679
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 441
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-11 11:05
个人简介

123

文章分类

全部博文(41)

文章存档

2019年(2)

2018年(3)

2017年(2)

2016年(11)

2015年(23)

我的朋友

分类: PERL

2015-04-25 08:02:56

关于perl-Gtk2 编程的基本概念,网上的一篇文章已有介绍,网址是:http://www.ibm.com/developerworks/cn/linux/l-perlgtk/。内容如下:
“4. 基本概念

下面,我们开始介绍一些在 Gtk2-perl 编程中一定要理解的基本概念。有了对这些概念的理解,你才可以轻易的进行更深入的学习。这些概念并不仅仅适用于 Gtk2-perl 的编程,很多概念也适用于大多数的 gui 编程。

1) 事件驱动模型

事 件驱动模型可以算作是 GUI 编程中最为重要的概念之一了。平时,我们运行的一般程序都是采用典型的批量处理模式以线性的方式运行所有的命令。然而,一个交互式的用户界面程序必须随时 准备运行任何一个操作:一个用户可能正漫步于菜单上,然后按下任何他想要的按钮,或者用户正在一个文字输入栏输入文字,或者他忽然切换到其他程序然后又再 切换回来完成刚才他没做完的事情。总之,程序必须随时响应用户触发的事件,这就叫做"事件驱动"。可以说,如果没有事件驱动模型,我们就无法实现用户的自 由操作,不理解事件驱动模型,我们就无法开始 Gtk2-perl 的编程。

事件驱动模型一般有这样的特点:

  • 归纳出基本的元素,例如:对于用户所有可能的动作事先要做出归纳总结。
  • 一个事件驱动程序一般都有一个处于中心地位的事件队列处理部分和一个事件队列。当一个事件发生时就向事件队列添加一项。事件队列处理部分则不断地处理事件队列中的各种事件,而且每处理一个事件时都要通知对这个事件感兴趣的子程序。

我们来更加具体的解释一下:当用户点击一个按钮的时候,一个按钮事件就被添加到事件队列中,随着事件队列的不断被处理,轮到我们添加的按钮事件时,事件队列处理部分就会开始处理这个事件,同时通知任何对这个事件感兴趣的子程序。

在 Gtk2-perl 中,事件驱动的逻辑实现是在内部完成的。我们只需要理解这个概念就可以了。

2) 主循环系统

所 谓的主循环系统就是上面我们介绍的事件队列处理系统的一部分。由于我们需要无限的等待用户的输入事件,所以我们必须建立一个循环,这个循环可以不断的读出 用户的输入事件,并处理这些事件,在这个循环中我们还要处理一些其他的事情,例如等待 socket 数据到来等等,这就是主循环系统。主循环系统有时要处理事件,但是在大多数时候,主循环一般会处于空闲状态。在空闲状态下,主循环系统释放 cpu 等计算机资源,等待新的事件到来。一个好的 GUI 系统,空闲时间的分配是十分重要的。为了随时能够响应用户的输入,必须有足够的空闲等待用户的输入。如果大量的资源都被占用,那么用户的输入将得不到及时 地响应,用户对于这个 GUI 系统将会十分失望。

在 Gtk2-perl 中,Gtk2 -> main 语句代表着开始主循环。

顺便一提:Gtk2 -> init 语句代表 Gtk2-perl 程序的初始化,在任何 Gtk2-perl 程序中,我们都必须先初始化,初始化完成后我们才可以开始编写与 Gtk+ 相关的语句。

3) 信号系统

信号系统也是事件驱动模型中的一部分。所谓信号系统就是当某一件事情(例如,用户的某个操作动作)发生的时候我们就会得到一个信号,然后我们按照事先规定好的如何处理这种信号的方法来处理这个信号。

在 Gtk2-perl 中,我们的信号系统有两种,一种是底层的通用信号系统,一种是每个控件特殊的信号系统。

底层的通用信号都有自己的唯一独立名称,总共有 30 多种。这些信号一般是用在自定义的控件中,例如:现有的控件没有能达到你的需要,你想自己的编写一个特殊目的的控件,这时要用到的信号系统就是底层的通用信号。

每 个控件的独立信号系统,随着控件的不同而不同,例如:按钮 button 控件可以有自己的信号系统,当 'pressed' 信号发生时证明用户正在按下这个按钮;而文字 textview 控件也有自己的信号系统,当我们在文字控件中移动光标时,我们就可以触发 move-cursor 信号。 信号系统的基本原则是必须明确声明信号才能生效。换句话说就是如果对于某个信号你没有事先声明要捕获这个信号,那么系统将不会理会这个信号。即使是最简单 的关闭窗口信号,如果没有事先声明,系统也不会理会,就像我们上面的 Helloworld.pl 中的一定要添加 $win -> signal_connect ( destroy => sub {Gtk2 -> main_quit } );这句话,否则点击关闭窗口的按钮将不起作用。这一点对于最初接触 GUI 编程的朋友一定要注意。 信号系统的一般用法是:$widget -> signal_connect ('signal' , sub{do…} );这里 $widget 一般是指 GUI 程序中的某个窗体,在这里我们看到,我们在某个$widget 上添加信号捕获,当某个 signal 发生时,我们就去执行 sub{ do…. } 的子程序。

4) 绘图上下文

所谓的绘图 上下文就是用来封装绘图属性的,所有的绘图操作都要用绘图上下文来作为自己的参数。简单点说就是绘图上下文就是一个包含了所有的绘图属性的对象(例如:背 景的色彩,一条线的宽度等等),然后将这个绘图上下文作为你要绘制图像的参数来输入从而决定这个图像如何绘制。

绘图上下文的优势在于:通过使用绘图上下文将各种绘图属性的集中在几个对象,可以大大的减少重复的绘图属性的设定,从而让一个绘图上下文为多个不同的绘图来作为参数。更加准确的说,这种优势是为了减少程序中的重复编写与输入,提高程序的编写与运行效率。

绘图上下文的基本用法:$gc = Gtk2::Gdk::GC -> new ( $drawable , $values=undef )

5) Gtk2-perl 的内部控件

现 代 GUI 编程的一个特点就是提供大量的易用控件给开发者,每个控件都可以完成某个特定的功能(例如:显示一段文字或允许用户输入一段文字等等),这样使得开发者在 开发一个 GUI 程序时可以用这些控件来组装成一个 GUI 程序。这很类似于我们现在的 html 格式的 web 制作,在我们制作一个网页时,就是利用了很多现成的 html 标签然后组合到一起形成完整的 html 网页。这种相似性甚至可以在很多微小的方面得到验证,例如将这些控件正确的布局时都要用到表格这样的控件。

在 Gtk2-perl 中提供的控件相当丰富,我们单单来看看这些控件的大类:

Windows:这个控件大类是负责最基本的 GUI 窗口,例如:主窗体控件,简单对话框的控件。

Display Widgets:这个控件类是负责基本显示的,例如:文字显示控件,图片显示控件。

Buttons and Toggles:负责各种类型的按钮,如基本按钮,check 类型的,radio 类型的。

Numeric/Text Data Entry:负责数字与文字的单行输入。

Multiline Text Editor:负责文字多行输入的控件。

Tree, List and Icon Grid Widgets:负责树形列表式、简单列表式或图标表格式的显示。

Menus, Combo Box, Toolbar:负责菜单、组合单元、工具栏。

Action-based menus and toolbars:负责基于动作的菜单与工具栏

Selectors (File/Font/Color/Input Devices) :负责文件、字体、颜色、输入设备的选择界面,这就是我们在打开文件或选择字体时所使用的那个通用的界面。

Layout Containers:负责各个控件的布局,让你可以很容易的在一个窗口上布置各个空间。

Ornaments:负责控件显示时的周围装饰,例如在各个控件间的分割条等

Scrolling:负责滚动条,用来将一些无法用一屏显示的控件中的内容滚动的显示。

Miscellaneous:负责其他剩余的事情,如显示一个箭头的控件,日历控件,一个绘画区域的控件等等。

Abstract Base Classes:负责抽象的控件,这些控件一般是基本控件的父类。

Cross-process Embedding:负责两个进程间的通讯。

Special-purpose features:负责某些特殊目的,例如:绘制曲线的控件,绘制标尺的控件。

所有的这些控件他们一般都有面向对象的特征,也就是存在父类与子类。父类一般是几个相似控件的一个集合。每个子类都可以使用父类的函数。这样使我们使用起这些控件更为方便,这也是 Gtk2-perl 的一个优势吧。”

阅读(2239) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~