Chinaunix首页 | 论坛 | 博客
  • 博客访问: 125571
  • 博文数量: 28
  • 博客积分: 2431
  • 博客等级: 大尉
  • 技术积分: 321
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-29 18:40
文章分类

全部博文(28)

文章存档

2011年(3)

2010年(6)

2009年(7)

2008年(12)

分类:

2010-07-25 01:12:30

最近不知怎样··搞去了··gtk-perl了·······以前在linux用c写过gtk···不过··不是一般的难哇··可能我的c太烂了···发现用perl容易写很多哇··哈哈··


#BY Weigun http://blog.chinaunix.net/u2/70443/

use strict;
use Gtk2 '-init';
use Glib qw(TRUE FALSE);
use Encode qw(decode);
my $encoding = "gbk";
my $win=Gtk2::Window->new('toplevel');
$win->set_position('center_always');
$win->set_title(decode($encoding, '简单计算器' ));
$win->set_size_request(300,300);
my @btns;#按钮数组

#create button

for (0..9,'+','-','CE','=')
{
    push @btns,Gtk2::Button->new($_);
}
#create label

my $label=Gtk2::Label->new('0');
$label->set_justify("right");
#boxes and table

my $vbox=Gtk2::VBox->new(FALSE,4);
my $hbox=Gtk2::HBox->new(FALSE,4);
my $table=Gtk2::Table->new(4,3,FALSE);
#pack in hbox

for my $btn (@btns)
{
    my $btn_label=$btn->get_label();
    $hbox->add($btn) if $btn_label eq 'CE' or $btn_label eq '=';
}
#pack in table

my ($i,$j)=(0,0);
for my $num_btn (@btns)
{
    my $btn_label=$num_btn->get_label();
    if($btn_label=~/^[0-9+-]$/)
    {
        while($i<=2)#控制行

        {
            while($j<4)#控制列

            {
                $table->attach_defaults($num_btn,$i, $i+1, $j, $j+1);
                last;
            }
            $i>=2 ?($i=0,++$j) : (++$i);
            last;
        }
    }
}
#pack label,table,hbox in vbox

$vbox->pack_start($label,TRUE,TRUE,0);
$vbox->pack_start($table,TRUE,TRUE,0);
$vbox->pack_start($hbox,TRUE,TRUE,0);
my $text='';#存放计算式

#设置callback

for (@btns)
{
    my $btn_lb=$_->get_label();
    if($btn_lb=~/^[0-9+-]$/)
    {
        $_->signal_connect(clicked =>\&btn_clicked);
    }
    elsif($btn_lb=~/^CE$/)
    {
        $_->signal_connect(clicked =>\&btn_CE);
    }
    else
    {
        $_->signal_connect(clicked =>\&btn_equal);
    }
}
$win->signal_connect('delete_event' => sub { Gtk2->main_quit; });
#pack vbox in window

$win->add($vbox);
$win->show_all();
Gtk2->main();

sub btn_clicked
{
    my $btn=shift;
    $text.=$btn->get_label();
    $label->set_text($text);
}

sub btn_CE
{
    my $btn=shift;
    $text='';
    $label->set_text(0);
}

sub btn_equal
{
    my $btn=shift;
    $text=eval($text);
    $text='ERROR' if !defined $text;
    $label->set_text($text);
}


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

chinaunix网友2010-08-31 21:51:33

代码也挺长呢