一个较为完整的简易浏览器实例
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.一个较为完整的简易浏览器实例
use Gtk2;
use Glib qw( TRUE FALSE );
use LWP::UserAgent; ##这个模块用来取回或者发送http 数据
use HTML::TokeParser; ##这个模块用来分析取回的html 数据
use strict;
use Encode qw/encode decode/;
use URI; ##分析url 地址模块
my $ua = LWP::UserAgent -> new;
$ua -> timeout( 30 ); ##设定http 取回的超时时间
$ua -> agent( 'perl web browser 0.1 by ' ); ##设定http头
$ua -> default_header( 'Pragma' => 'no-cache',
'Accept' => '*/*',
);
$ua -> proxy( ['http', 'ftp'], 'http://*.*.*.*:8080' ); ##设定代理服务器地址,不用可以注释掉
my $p;
my $title = 'Perl web browser'; ##程序的标题
my $url_base;
Gtk2 -> init;
my $hovering_over_link = 0;
my $hand_cursor = Gtk2::Gdk::Cursor -> new ( 'hand2' ); ##添加一个手型的光标
my $regular_cursor = Gtk2::Gdk::Cursor -> new ( 'xterm' );
my $win = Gtk2::Window -> new( );
$win -> set_title( $title );
$win -> set_size_request( 640,480 ); ##设定窗口的大小
$win -> set_position( 'center' ); ##设定窗口出现的位置
$win -> signal_connect( destroy => sub{Gtk2 -> main_quit;} );
my $buffer = Gtk2::TextBuffer -> new( ); ##添加一个文字缓冲,用于存储所有html数据来显示
my $tag_h1 = $buffer -> create_tag ( "title1", font => "Sans 20" ); ##建立一个h1文字标签
my $tag_h2 = $buffer -> create_tag ( "title2", font => "Sans 18" );
my $tag_h3 = $buffer -> create_tag ( "title3", font => "Sans 14" );
my $vbox = Gtk2::VBox -> new; ##添加一个VBox,用来将其他控件竖直布局
my $hbox = Gtk2::HBox -> new; ##添加一个Hbox 用来水平布局其他控件
my $entry = Gtk2::Entry -> new; ##添加一个单行文字输入控件用来输入url 地址
$entry -> set_text ( '/' ); ##设置url 输入栏里的初始地址
$entry -> signal_connect( 'key-release-event' , \&filter_key ); ##设定url 输入栏中对于键盘事件的回应
$hbox -> pack_start( $entry,1,1,0 ); ##在水平hbox 栏中先放置url 输入栏
my $button = Gtk2::Button -> new_from_stock ( 'gtk-apply' ); ##添加一个提交按钮
$button -> can_focus ( 0 ); ##设置该按钮不能聚焦
$button -> signal_connect( 'released',\&get_url_content,$entry -> get_text ); ##设定按钮按下触发的子程序
$hbox -> pack_start( $button,0,0,0 ); ##在水平hbox 栏中后放入提交按钮
my $sw = Gtk2::ScrolledWindow -> new ( undef,undef ); ##添加一个滚动窗口
$sw -> set_policy( 'automatic','automatic' ); ##设定滚动窗口的出现滚动条的规则
my $textview = Gtk2::TextView -> new( ); ##添加一个多行文字控件用于显示html数据$textview -> signal_connect ( motion_notify_event => \&motion_notify_event ); ##设置鼠标在多行控件上滑动时触发的子程序
$textview -> signal_connect ( button_release_event => \&button_release ); ##设定鼠标在多行控件上按下释放时触发的子程序
$textview -> can_focus ( 0 );
$textview -> set_editable( 0 ); ##该文字控件不可编辑
$textview -> set_left_margin ( 10 ); ##设置文字控件左边的空白
$textview -> set_right_margin ( 10 );
$textview -> set_wrap_mode( 'GTK_WRAP_WORD_CHAR' ); ##设置文字控件的换行方式
$textview -> set_buffer( $buffer ); ##给文字控件添加刚才建立的缓冲
$sw -> add( $textview ); ##在滚动窗口中添加文字控件从而让文字窗口可以滚动显示$vbox -> pack_start( $hbox,0,0,1 ); ##竖直的先放置刚才的水平控件
$vbox -> pack_start( $sw,1,1,1 ); ##竖直的后放置滚动窗口控件
$win -> add( $vbox ); ##在整个窗口中添加竖直控件,这里最后完成了所有的控件布局$win -> show_all; ##显示窗口中的所有元素
Gtk2 -> main; ##开始主循环
sub filter_key{ ##监听url 输入栏,当有回车输入时取回url 数据
my ( $widget,$event ) = @_;
my $key = Gtk2::Gdk::keyval_name( $event,$event -> keyval );
if ( $key eq "Return" || $key eq "KP_Enter" ){
get_url_content ( $widget,$entry -> get_text ); }
}
sub get_url_content{ ##取回html 数据
my ( $widget,$url,$mark ) = @_;
unless ( $url = ~m/^http/ ) {
unless ( $url = ~m/(.*)\/(.*)/ ) {
$url = $url."/";
}
$url = 'http://'.$url;
$entry -> set_text( $url );
}
unless ( $url = ~m/^http:\/\/(.*)\/(.*)/ ) {
$url = $url."/";
$entry -> set_text( $url );
}