文章目录
一、图形用户界面简介
Graphical User Interface(GUI)是一种允许用户与电子设备通过图形图标和可视化标志进行交互的用户界面,替代基于文本的命令行输入的界面。
Desktop environment & window managers:
GTK(GIMP Toolkit)是一个跨平台的部件工具箱(widget toolkit),用于创建图形用户界面,GTK有 GNU Lesser General Public License,允许免费和私有软件使用它。
Qt是一个跨平台的应用框架,用于创建经典的嵌入的图形用户界面,Qt可以用于商业和开源执照 GPL2.0、3.0和LGPL3.0。
wxWidgets是一个开源的跨平台的C++构架库(framework),它可以提供GUI(图形用户界面)和其它工具。
Tk是一个开源跨平台的部件工具箱,提供了GUI部件,用于很多语言构建用户界面的库。
Tk源于Tcl,Tcl是一种高水平、通用的动态编程语言。类似于Tcl,Tk支持Unicode,可以运行于多种系统如Mac OS、Unix、Linux、Ms Windows
二、Perl GUI实现
Perl可以通过Tk、Qt、GTK、Wx实现构建图形用户界面。
使用WxPerl建立软件界面
#!/usr/bin/perl -w
use stricts;
use Wx;
###创建一个应用的对象,用于管理全局状态和处理事件
package MyApp;
use base 'Wx::App';
sub OnInit{
my($self)=@_;
my $frame=Wx::Frame->new(
undef,
-1,
'Hello World',
[-1,-1],
[250,250],
);
$frame->Show(1); ##顶层的窗口不会自动显示,需要用$frame->show;语句来显示。
return 1;
}
package main;
my $app=MyApp->new;
$app->MainLoop;
当创建了应用对象后,wxPerl呼叫
OnInit
方法用于初始化全局应用数据并通常产生一个或多个框。OnInit方法是自动被呼叫的。可以进行应用水平的初始化。
注意wxWdiget要求每个窗口有一个为整数的ID,在wxWidget中,大部分时候不用考虑ID的值,所以可以将-1或者常量wxID_ANY传给窗口构建器用于使wxWidgets产生一个唯一的ID。
重要的概念——Sizer
Sizer是WxWidgets类中Wx::Sizer类及其的子类,主要用于确定框架和对话的布局控制。
所有的sizers均为容器,即它们被用于展示它们所包含的一个对话框或者框项目(或者几个对话项目),这种项目有时被称为sizers children。
所有的children均有以下共同的特性:最小尺寸、边界、对齐、拉伸系数
①最小尺寸:通常和起始尺寸相同,可以通过Wx::Sizer精确设置也可以通过wxWidgets计算得来,通常用-1号项目的高和/或宽来设定。
注意只有某些控制能够计算它们的尺寸,checkbox;
而有些控制如listbox没有天然的框或者高,因此需要一个明确的尺寸;
还有些控制能计算它们的高而不能计算宽,如single line text control。
②边界:边界是空白,用于分开对话项目和对话框。可以设定所有的边也可以仅设定几个边的组合,如仅设定上和下边界。
如下图为分别设置0,5,10为边界的对话框。
③对齐:通常对齐项目给出它最小尺寸加边界更多的空间。
下图为一个对话框包含了一个listbox和一个含有三个按钮的水平box sizer,一个按钮是中间对齐,一个是顶端对齐,一个是底部对齐。
④拉伸系数:下图指定一个按钮的拉伸系数为1,另两个的为0,则1的可以拉伸,而0的则不变。
(一)Sizer类:BoxSizer
(二)Sizer类:StaticBoxSizer
(三)Sizer类:GridSizer
(四)Sizer类:FlexGridSizer
(五)Sizer使用实例
#!/usr/bin/perl -w
use strict;
use Wx;
use wxPerl::Constructors;
package MyApp;
use base 'Wx::App';
sub OnInit{
my $self=shift;
my $frame=wxPerl::Frame->new(undef,'A wxPerl Application');
$frame->SetMinSize([120,80]);
my $sizer=Wx::BoxSizer->new(&Wx::wxVERTICAL);
my $button=wxPerl::Button->new($frame,'Click Me');
$sizer->Add($button,2,&Wx::wxEXPAND);
my $button2=wxPerl::Button->new($frame,'DO NOT CLICK');
$sizer->Add($button2,1,&Wx::wxEXPAND);
Wx::Event::EVT_BUTTON($button,-1,sub {
my($b,$evt)=@_;
$b->SetLabel('Clicked');
$b->Disable;
});
}
##更多的案例可使用Wx::Demo
下载后进入bin运行wxperl_demo.pl