一个较为完整的简易浏览器实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 );

}

相关文档
最新文档