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 + -
显示快捷键?