fig21_13.pl
来自「PERL语言资料 可以用于PERL程序设计」· PL 代码 · 共 165 行
PL
165 行
#!/usr/bin/perl
# Fig 21.13: fig21_13.pl
# GUI Calculator with Tk.
use strict;
use warnings;
use Tk;
my $calculator = new MainWindow();
my ( $number1, $number2 );
my $oldOperator = '';
our $label = $calculator->Label( width => '21' )->pack();
my @frames;
for ( 1 .. 3 ) {
push( @frames,
$calculator->Frame()->pack( -side => 'top' ) );
}
my $frame4 = $calculator->Frame()->pack( -side => 'top' );
my $frame5 = $calculator->Frame()->pack( -side => 'top' );
for ( 1 .. 9 ) {
my $frame = $frames[ int( ( $_ - 1 ) / 3 ) ];
$frame->Button( text => $_,
command => [ \&number, $_ ] )->pack( -side => "left" );
}
$frame4->Button( text => 'Enter',
command => [ \&calculate, '=' ] )->pack( -side => "left");
$frame4->Button( text => '0',
command => [ \&number, 0 ] )->pack( -side => "left" );
$frame4->Button( text => 'Clear',
command => [ \&calculate, 'cl' ] )->pack( -side => "left" );
$frame5->Button( text => '+',
command => [ \&calculate, '+' ] )->pack( -side => "left" );
$frame5->Button( text => '-',
command => [ \&calculate, '-' ] )->pack( -side => "left" );
$frame5->Button( text => '*',
command => [ \&calculate, '*' ] )->pack( -side => "left" );
$frame5->Button( text => '/',
command => [ \&calculate, '/' ] )->pack( -side => "left" );
MainLoop();
sub number
{
my $digit = shift();
$number1 = $number1 ? $number1 . $digit : $digit;
$label->configure( text => $number1 );
if ( $oldOperator eq '=' ) {
$number2 = 0;
}
}
sub calculate
{
my $operation = shift();
if ( $operation eq 'cl' ) {
clear();
$label->configure( text => $number1 );
}
elsif ( $operation eq '=' ) {
if ( $oldOperator ) {
if ( $oldOperator eq '/' && ( $number1 == 0 ) ) {
$label->configure(
text => 'Error: Divide by zero.' );
clear();
}
else {
if ( $oldOperator eq '+' ) {
$number2 += $number1;
}
elsif ( $oldOperator eq '-' ) {
$number2 -= $number1;
}
elsif ( $oldOperator eq '*' ) {
$number2 *= $number1;
}
elsif ( $oldOperator eq '/' ) {
$number2 /= $number1;
}
$number1 = 0;
$oldOperator = $operation;
$label->configure( text => $number2 );
}
}
else {
$number2 = $number1;
$number1 = 0;
$oldOperator = $operation;
}
}
elsif ( $oldOperator ) {
if ( ( $oldOperator eq '/' ) && ( $number1 == 0 ) ) {
$label->configure( text => 'Error: Divide by zero' );
clear();
}
else {
if ( $oldOperator eq '+' ) {
$number2 += $number1;
}
elsif ( $oldOperator eq '-' ) {
$number2 -= $number1;
}
elsif ( $oldOperator eq '*' ) {
$number2 *= $number1;
}
elsif ( $oldOperator eq '/' ) {
$number2 /= $number1;
}
elsif ( $oldOperator eq '=' ) {
$number2 = $number1 || $number2;
}
$number1 = 0;
$oldOperator = $operation;
$label->configure( text => $number2 );
}
}
else {
$number2 = $number1;
$number1 = 0;
$oldOperator = $operation;
}
}
sub clear
{
$number2 = 0;
$number1 = 0;
$oldOperator = "";
}
###########################################################################
# (C) Copyright 2001 by Deitel & Associates, Inc. and Prentice Hall. #
# All Rights Reserved. #
# #
# DISCLAIMER: The authors and publisher of this book have used their #
# best efforts in preparing the book. These efforts include the #
# development, research, and testing of the theories and programs #
# to determine their effectiveness. The authors and publisher make #
# no warranty of any kind, expressed or implied, with regard to these #
# programs or to the documentation contained in these books. The authors #
# and publisher shall not be liable in any event for incidental or #
# consequential damages in connection with, or arising out of, the #
# furnishing, performance, or use of these programs. #
###########################################################################
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?