#!C:/perl/bin/perl.exe -w
package TalkTimer;
use strict;
use warnings;
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';
use Gtk2::GladeXML;
use constant TIMER_MAXIMUM => 5 * 60;
use constant TIMER_WARNING => 4 * 60;
use constant WARNING_SOUND => 'WARNING.WAV';
use constant TIMES_UP_SOUND => 'GONG.WAV';
use base 'Class::Accessor::Fast';
sub run { my $self = shift->new; Gtk2->main; }
sub new { return bless({}, shift)->init; }
sub init {
my $self = shift;
my $glade_file = __FILE__;
$glade_file =~ s/TalkTimer.pm/talk_timer.glade/;
my $gui = Gtk2::GladeXML->new($glade_file);
$gui->signal_autoconnect_from_package($self);
$self->label ($gui->get_widget('timer_label') );
$self->progress ($gui->get_widget('progress_bar'));
$self->start_stop($gui->get_widget('start_stop') );
##说说有问题的几个地方
#1. $self->label->modify_font
$self->label->modify_font(
Gtk2::Pango::FontDescription->from_string("Sans 40")
);
$gui->get_widget('appwin')->show();
return $self;
}
sub on_appwin_delete_event {
Gtk2->main_quit;
}
__PACKAGE__->mk_accessors(qw(
label progress start_stop
start_time running warned times_up
));
sub on_start_stop_clicked {
my $self = shift;
if ($self->running) {
$self->stop_timer;
}
else {
$self->start_timer;
}
}
sub start_timer {
my $self = shift;
$self->start_time(time);
$self->running(TRUE);
$self->warned(FALSE);
$self->times_up(FALSE);
$self->start_stop->set_label('Stop');
Glib::Timeout->add(1000, sub { $self->tick });
}
sub stop_timer {
my $self = shift;
$self->running(FALSE);
#2.$self->label->set_text
$self->label->set_text('0:00');
$self->progress->set_fraction(0);
$self->start_stop->set_label('Start');
}
sub tick {
my $self = shift;
return FALSE unless $self->running;
my $secs = time - $self->start_time;
#3.应该来说是label->set_text这个导致的,因为不认识
$self->label->set_text(
sprintf('%d:%02d', int($secs/60), $secs % 60)
);
my $frac = $secs > TIMER_MAXIMUM ? 1 : $secs/TIMER_MAXIMUM;
$self->progress->set_fraction($frac);
if($secs >= TIMER_MAXIMUM and !$self->times_up) {
$self->times_up(TRUE);
$self->play_times_up_sound;
}
elsif($secs >= TIMER_WARNING and !$self->warned) {
$self->warned(TRUE);
$self->play_warning_sound;
}
return TRUE;
}
sub play_warning_sound { play_sound(WARNING_SOUND) }
sub play_times_up_sound { play_sound(TIMES_UP_SOUND)}
sub play_sound {
my $filename = shift;
system("play $filename");
}
1;
|