http://qs321.pair.com?node_id=83879
Category: GUI Programming
Author/Contact Info Jouke Visser (jouke@pvoice.org)
Description: pVoice is a speechapplication for disabled people who can't speak themselves. By only generating left and right mousebuttonclicks the whole application can be operated.

update: pVoice has grown so much that it's not possible to keep the code here updated. You can find the sourcecode of pVoice 2.x at opensource.pvoice.org. Binary releases (packed with ActiveState's PerlApp) can be found on www.pvoice.org.
The current pVoice does no longer use Tk for the GUI, but wxPerl instead

I'll keep the code updated in here, though pVoice 0.01 was posted in Cool Uses for Perl. For more backgroundinfo, look at http://www.pvoice.org

This is version 0.02.1
The current version is 2.1
#!/usr/bin/perl -w
#
# pVoice
#
# For more information go to http://www.pvoice.org where you can
# download a zipfile containing this file, the README and pvoicecommon
+.pm
#
# See the mentioned  README file for a little documentation
# Since version 0.02.1 you also need pvoicecommon.pm, which is the obj
+ect-
# package. 

use Tk 800.017;
use Tk::JPEG;

# And on unix-systems it requires the system command 'play' to play th
+e .wav 
# files, and on Win32 systems, it requires Win32::Sound for the same p
+urpose.
#
# Author:        Jouke Visser
# Last modification:    May 28, 2001
#
# pVoice is free for personal use.
# Copyright (c) 2001, Jouke Visser
#
# Changelog:
# 0.01: First release
# 0.02: Little bugfix (arrow-up on first position never showed up)
# 0.02.1: OO-ified the whole thing and parametrisized as much as possi
+ble.
use strict;

#---------------------------------------------------------------------
+---------
use pvoicecommon;
# Configuration-stuff
my $pv = new pvoicecommon(
            program_title    => "pVoice 0.02.1 development",
            bgcolor        => 'white',
            active_bgcolor    => 'red',
            sounddir    => "./data",
            current_category=> "",
            current_page    => 1,
            indexfile     => "index.txt",
            catfile        => "cat.txt",
            sound_ext    => "wav",
            img_ext        => "jpg",
            border_width    => 10,
            cellpadding    => 4,
            columns        => 4,
            rows        => 4,
            selected_button    => 0
            );
my $img_ext = $pv->img_ext();
$pv->next_img("volgende.$img_ext");
$pv->prev_img("vorige.$img_ext");
$pv->up_img("omhoog.$img_ext");

# Create the main window
my $main = MainWindow->new(-background => $pv->bgcolor());
# Maximize the window
my ($screenw, $screenh) = ($main->screenwidth, $main->screenheight);
$main->withdraw();
$main->geometry($screenw."x".$screenh."+0+0");
$main->deiconify();
$main->raise();

# Write the title of the window
$main->title($pv->program_title());

#create the window for the images
$pv->mainframe($main->Frame(-background => $pv->bgcolor())->pack());

# Write the header
$pv->mainframe()->gridRowconfigure(0, -weight => 0, -pad => $pv->cellp
+adding());
my $label=$main->Label(    -text => $pv->program_title(), 
            -background => $pv->bgcolor());
$label->grid(    -in     => $pv->mainframe(),
        -column => 0,
        -row    => 0,
        -columnspan=> $pv->columns()
        );

# Determine the maximum size of each icon
$main->update(); # To determine the height of the $label the window mu
+st be updated
$pv->max_height(int(    ($main->height() - $label->height())/$pv->rows
+())-
            (2*($pv->border_width() + $pv->cellpadding())
            ));
$pv->max_width(int(    (($main->width)/$pv->columns())-
            2*($pv->border_width() + $pv->cellpadding())
            ));

#configure the grid to constant cellsizes
$pv->configurecolumns(startcolumn => 0);
$pv->configurerows(startrow => 1);

# Read the categoryfile and draw the first page with category-buttons
my @categories = $pv->readcategoryfile();
$pv->drawcatpage(\@categories);

# Make the first button active 
$pv->buttons()->[$pv->selected_button()]->configure(-state => 'active'
+);

# Right mouseclick means select next item
$main->bind('<Button-3>', 
            sub {
                $pv->buttons()->[$pv->selected_button()]->configure(
                                -state => 'normal');
                if ($pv->selected_button() < @{$pv->buttons()} -1)
                    {$pv->selected_button($pv->selected_button()+1)}
                else    {$pv->selected_button(0)}
                $pv->buttons()->[$pv->selected_button()]->configure(
                                -state => 'active');
                }
            );

# Left mouseclick means execute current item
$main->bind('<Button-1>', 
        sub {
                $pv->buttons()->[$pv->selected_button()]->invoke();
                }
            );
MainLoop();
Replies are listed 'Best First'.
Re: pVoice
by Beatnik (Parson) on May 29, 2001 at 15:58 UTC
    Maybe you could add some Festival bridge, CPAN has a few modules on it.

    I've noticed it can get quite resource consuming... but that goes for any other server I run on my ole P133 :)

    Greetz
    Beatnik
    ... Quidquid perl dictum sit, altum viditur.
      I'm working on that already. Only problem with it is the support for Dutch language. At home I have a test running using Festival but it only generates an English male/female voice... and that produces horrible Dutch :)

      Jouke Visser, Perl 'Adept'
      Using Perl to help the disabled: pVoice and pStory
A reply falls below the community's threshold of quality. You may see it by logging in.