Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » En Comunidad » Proyectos » Funciones para aplicaciones en consola Responder al tema
Nuevo tema


Página 1 de 1  [ 2 mensajes ] 
 
Nota 2011-02-25 01:55 @121

Perlero Nuevo
Registrado: 2011-02-25 00:15 @052
Mensajes: 2
Funciones para aplicaciones en consola
Hola amigos les comparto unas funciones que hice para la creaciones de menús y otras funciones más, para facilitar la creación de pequeñas aplicaciones de consola.
Espero que les sea útil.
Saludos.

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3.  
  4.    require Term::Screen;
  5.    $scr = new Term::Screen;
  6.    unless ($scr) { die "Algo anda mal \n"; }
  7.    $scr->clrscr();
  8.    
  9.    sub marco {
  10.        my $x1 = $_[0];
  11.        my $x2 = $_[1];
  12.        my $y1 = $_[2];
  13.        my $y2 = $_[3];
  14.        my $forma = $_[4];
  15.        my $texto = $_[5];
  16.        
  17.        my $a;
  18.        my $b;
  19.        
  20.        $scr->at($y1, $x1)->puts($forma);
  21.        
  22.        my $esquina = substr ($forma, 0, 1);
  23.        $scr->at($y1, $x1)->puts($esquina);
  24.        
  25.        $esquina = substr ($forma, 1, 1);
  26.        for($a = $x1 + 1; $a<$x2; $a++) {
  27.            $scr->at($y1, $a)->puts($esquina);
  28.        }
  29.        
  30.        $esquina = substr ($forma, 2, 1);
  31.        $scr->at($y1, $x2)->puts($esquina);
  32.        
  33.        $esquina = substr ($forma, 3, 1);
  34.        for($a = $y1 + 1; $a<$y2; $a++) {
  35.            $scr->at($a, $x2)->puts($esquina);
  36.        }
  37.        
  38.        $esquina = substr ($forma, 4, 1);
  39.        $scr->at($y2, $x2)->puts($esquina);
  40.        
  41.        $esquina = substr ($forma, 5, 1);
  42.        for($a = $x1 + 1; $a<$x2; $a++) {
  43.            $scr->at($y2, $a)->puts($esquina);
  44.        }
  45.        
  46.        $esquina = substr ($forma, 6, 1);
  47.        $scr->at($y2, $x1)->puts($esquina);
  48.        
  49.        $esquina = substr ($forma, 7, 1);
  50.        for($a = $y1 + 1; $a<$y2; $a++) {
  51.            $scr->at($a, $x1)->puts($esquina);
  52.        }
  53.        
  54.        if (length($forma) > 7) {
  55.            my $b;
  56.            $esquina = substr ($forma, 8, 1);
  57.            for($a = $x1 + 1; $a < $x2; $a++) {
  58.                 for($b = $y1 + 1; $b < $y2; $b++) {
  59.                     $scr->at($b, $a)->normal()->puts($esquina);
  60.                 }
  61.            }
  62.        }
  63.        
  64.        if (length($texto) > 0) {
  65.            $scr->at($y1, $x1 + 2)->puts("[ " . $texto . " ]");
  66.        }  
  67.    }
  68.    
  69.    sub menu_h {
  70.        my @items = @_;
  71.        my $fila;
  72.        my $cantidad;
  73.        my $largo_max;
  74.        my $mas_largo;
  75.        my $a;
  76.        my $espacios;
  77.        my $separacion;
  78.        my $falta;
  79.        my $espacio1;
  80.        my $espacio2;
  81.        my $opcion = 0;
  82.        my $puntero = 0;
  83.        my $sombra;
  84.        my $c;
  85.        
  86.        $fila = pop @items;
  87.        
  88.        $scr->noecho();
  89.        
  90.        $cantidad = @items;
  91.        for( $a = 0; $a < $cantidad; $a++) {
  92.            if (length($items[$a]) > $mas_largo) {
  93.                 $mas_largo = length($items[$a]);
  94.            }
  95.        }
  96.        
  97.        for($a = 0; $a < $cantidad; $a++) {
  98.            $falta = $mas_largo - length($items[$a]);
  99.            if ($falta == 1) {
  100.                $espacio1 = " "x $falta;
  101.                $espacio2 = "";
  102.            } else {
  103.                $espacio1 = " "x ($falta / 2);
  104.                $espacio2 = " "x ($falta / 2);
  105.            }
  106.            $items[$a] = $espacio2 . $items[$a] . $espacio1;
  107.        }
  108.        
  109.        $espacios = $cantidad + 1;
  110.        
  111.        $separacion = (100 - ($mas_largo * $cantidad)) / $espacios;
  112.        $sombra = " " x $mas_largo;
  113.        
  114.        while ($opcion == 0) {
  115.            for($a = 0; $a < $cantidad; $a++) {
  116.                $scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->normal()->puts($sombra);
  117.                if ($a == $puntero) {
  118.                     $scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->reverse()->puts($items[$a])->normal();
  119.                } else {
  120.                     $scr->at($fila, ($a * $mas_largo) + ($separacion * ($a + 1)))->normal()->puts($items[$a]);
  121.                }
  122.            }
  123.            $scr->at(0,0);
  124.            $c = $scr->getch();
  125.            if ($c eq "kl") {
  126.                $puntero--;
  127.                if ($puntero < 0) {
  128.                    $puntero = $cantidad - 1;
  129.                }
  130.            }
  131.            
  132.            if ($c eq "kr") {
  133.                $puntero++;
  134.                if ($puntero > $cantidad - 1) {
  135.                    $puntero = 0;
  136.                }
  137.            }
  138.            
  139.            if (ord($c) == 13) {
  140.                $opcion = $puntero + 1;
  141.            }
  142.            
  143.            if ($c eq "-" || $c eq "+") {
  144.                $opcion = ord($c);
  145.            }
  146.        }
  147.        
  148.        $scr->echo();
  149.        return ($opcion);
  150.    }
  151.    
  152.    sub menu_v {
  153.        my @items = @_;
  154.        my $col;
  155.        my $fila;
  156.        my $cantidad;
  157.        my $largo_max;
  158.        my $mas_largo;
  159.        my $a;
  160.        my $espacios;
  161.        my $separacion;
  162.        my $falta;
  163.        my $espacio1;
  164.        my $espacio2;
  165.        my $opcion = 0;
  166.        my $puntero = 0;
  167.        my $sombra;
  168.        my $c;
  169.        
  170.        $col = pop @items;
  171.        $fila = pop @items;
  172.        
  173.        $scr->noecho();
  174.        
  175.        $cantidad = @items;
  176.        for( $a = 0; $a < $cantidad; $a++) {
  177.            if (length($items[$a]) > $mas_largo) {
  178.                 $mas_largo = length($items[$a]);
  179.            }
  180.        }
  181.        
  182.        for($a = 0; $a < $cantidad; $a++) {
  183.            $falta = $mas_largo - length($items[$a]);
  184.            if ($falta == 1) {
  185.                $espacio1 = " "x $falta;
  186.                $espacio2 = "";
  187.            } else {
  188.                $espacio1 = " "x ($falta / 2);
  189.                $espacio2 = " "x ($falta / 2);
  190.            }
  191.            $items[$a] = $espacio2 . $items[$a] . $espacio1;
  192.        }
  193.        
  194.        if ($col == 0) {
  195.            $col = (100 - $mas_largo) / 2;
  196.        }
  197.        
  198.        $sombra = " " x $mas_largo;
  199.        
  200.        while ($opcion == 0) {
  201.            for($a = 0; $a < $cantidad; $a++) {
  202.                $scr->at($fila + $a, $col)->normal()->puts($sombra);
  203.                if ($a == $puntero) {
  204.                     $scr->at($fila + $a, $col)->reverse()->puts($items[$a])->normal();
  205.                } else {
  206.                     $scr->at($fila + $a, $col)->normal()->puts($items[$a]);
  207.                }
  208.            }
  209.            $scr->at(35,0);
  210.            $c = $scr->getch();
  211.            if ($c eq "ku") {
  212.                $puntero--;
  213.                if ($puntero < 0) {
  214.                    $puntero = $cantidad - 1;
  215.                }
  216.            }
  217.            
  218.            if ($c eq "kd") {
  219.                $puntero++;
  220.                if ($puntero > $cantidad - 1) {
  221.                    $puntero = 0;
  222.                }
  223.            }
  224.            
  225.            if (ord($c) == 13) {
  226.                $opcion = $puntero + 1;
  227.            }
  228.            
  229.            if ($c eq "-" || $c eq "+") {
  230.                $opcion = ord($c);
  231.            }
  232.        }
  233.        
  234.        $scr->echo();
  235.        return ($opcion);
  236.    }  
  237.  
  238.    sub renglones {
  239.        my @matriz = @_;
  240.        my @datos;
  241.        my @etiquetas;
  242.        my @coor_x;
  243.        my @coor_y;
  244.        my @tipo;
  245.        my @tamano;
  246.        my $cantidad;
  247.        my $mas_largo = 0;
  248.        my $renglon = 0;
  249.        my @curso_pos;
  250.        my $resto;
  251.        my $valor;
  252.        my @conj;
  253.        my $salir = 0;
  254.        my $a;
  255.        my $c;
  256.        
  257.        $cantidad = @matriz;
  258.        
  259.        for ($a = 0; $a < $cantidad; $a++) {
  260.            @conj = @{$matriz[$a]};
  261.            push @datos, $conj[0];
  262.            push @etiquetas, $conj[1];
  263.            push @coor_y, $conj[2];
  264.            push @coor_x, $conj[3];
  265.            push @tipo, $conj[4];
  266.            push @tamano, $conj[5];
  267.            push @curso_pos, 0;
  268.            if ($mas_largo < length($etiquetas[$a])) {
  269.                $mas_largo = length($etiquetas[$a]);
  270.            }
  271.        }
  272.        
  273.        while ($salir == 0) {
  274.             for ($a = 0; $a < $cantidad; $a++) {
  275.                 $resto = " " x ($tamano[$a] - length($datos[$a]));
  276.                 $scr->at($coor_y[$a] + 0, $coor_x[$a] + 0)->normal()->puts($etiquetas[$a]);
  277.                 $scr->at($coor_y[$a] + 0, $coor_x[$a] + $mas_largo + 1)->reverse()->puts($datos[$a] . $resto)->normal();                    
  278.                 $scr->at($coor_y[$renglon], $coor_x[$renglon] + $mas_largo + 1 + $curso_pos[$renglon]);
  279.             }
  280.            
  281.             $c = $scr->getch();
  282.            
  283.             if ($c eq "ku") {
  284.                $renglon--;
  285.                if ($renglon < 0) {
  286.                    $renglon = $cantidad - 1;
  287.                }
  288.            }
  289.            
  290.            if ($c eq "kd") {
  291.                $renglon++;
  292.                if ($renglon > $cantidad - 1) {
  293.                    $renglon = 0;
  294.                }
  295.            }
  296.            
  297.            if ($c eq "kl") {
  298.                $curso_pos[$renglon]--;
  299.                if ($curso_pos[$renglon] < 0) {
  300.                    $curso_pos[$renglon] = $tamano[$renglon] - 1;
  301.                }
  302.            }
  303.            
  304.            if ($c eq "kr") {
  305.                $curso_pos[$renglon]++;
  306.                if ($curso_pos[$renglon] > $tamano[$renglon] - 1) {
  307.                    $curso_pos[$renglon] = 0;
  308.                }
  309.            }
  310.            
  311.            if (ord($c) == 13) {
  312.                $renglon++;
  313.                if ($renglon > $cantidad - 1) {
  314.                    $salir = 1;
  315.                }
  316.            }
  317.            
  318.            if ($c =~ m/\d/ && $tipo[$renglon] eq "n") {
  319.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  320.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  321.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  322.                    $curso_pos[$renglon]++;
  323.                }
  324.            }
  325.            
  326.            if ($c =~ m/\w/ && $tipo[$renglon] eq "c" && length($c) < 2) {
  327.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  328.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  329.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  330.                    $curso_pos[$renglon]++;
  331.                }
  332.            }
  333.            
  334.            if (ord($c) == 27) {
  335.                $salir = -1;
  336.            }
  337.            
  338.            if ($c eq "del" && $curso_pos[$renglon] < $tamano[$renglon]) {
  339.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . substr ($datos[$renglon], $curso_pos[$renglon] + 1, $tamano[$renglon]);
  340.            }
  341.            
  342.            if (ord($c) == 127 && $curso_pos[$renglon] > 0) {
  343.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon] - 1) . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  344.                $curso_pos[$renglon]--;
  345.            }
  346.            
  347.            if ($c eq " " && $tipo[$renglon] eq "c") {
  348.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  349.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  350.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  351.                    $curso_pos[$renglon]++;
  352.                }
  353.            }
  354.            
  355.            if ($c eq "-" && $curso_pos[$renglon] == 0 && $tipo[$renglon] eq "n") {
  356.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  357.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  358.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  359.                    $curso_pos[$renglon]++;
  360.                }  
  361.            }
  362.            
  363.            if ($c eq "." && $tipo[$renglon] eq "n" && $datos[$renglon] !~ m/\./) {
  364.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  365.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  366.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  367.                    $curso_pos[$renglon]++;
  368.                }  
  369.            }
  370.            if ($c eq "." && $tipo[$renglon] eq "c") {
  371.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  372.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  373.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  374.                    $curso_pos[$renglon]++;
  375.                }  
  376.            }
  377.            
  378.            if ($tipo[$renglon] eq "x" && length($c) < 2 && ord($c) != 127 && ord($c) != 13) {
  379.                $datos[$renglon] = substr ($datos[$renglon], 0, $curso_pos[$renglon]) . $c . substr ($datos[$renglon], $curso_pos[$renglon], $tamano[$renglon]);
  380.                $datos[$renglon] = substr ($datos[$renglon], 0, $tamano[$renglon]);
  381.                if ($curso_pos[$renglon] < $tamano[$renglon]-1) {
  382.                    $curso_pos[$renglon]++;
  383.                }
  384.            }
  385.            
  386.            if ( ($c eq "s" || $c eq "S" ) && $tipo[$renglon] eq "b") {
  387.                $datos[$renglon] = "S";
  388.            }
  389.            
  390.            if ( ($c eq "n" || $c eq "N" ) && $tipo[$renglon] eq "b") {
  391.                $datos[$renglon] = "N";
  392.            }
  393.        }
  394.        
  395.        return @datos;
  396.    }
  397.    
  398.    sub tabs {
  399.        my @items = @_;
  400.        my $coor_y1;
  401.        my $coor_x1;
  402.        my $coor_y2;
  403.        my $coor_x2;
  404.        my $cantidad;
  405.        my $puntero;
  406.        my $a;
  407.        my $b;
  408.        my $desf;
  409.        my $espacio;
  410.        
  411.        $coor_x2 = pop @items;
  412.        $coor_y2 = pop @items;
  413.        $coor_x1 = pop @items;
  414.        $coor_y1 = pop @items;
  415.        $puntero = pop @items;
  416.        
  417.        $cantidad = @items;
  418.        
  419.        &marco($coor_x1, $coor_x2, $coor_y1, $coor_y2, "           ");
  420.        &marco($coor_x1, $coor_x2, $coor_y1+2, $coor_y2, "/-+|+-+|");
  421.        
  422.        for ($a = 0; $a < $cantidad; $a++) {
  423.             $desf = 0;
  424.             for ($b = 0; $b < $a; $b++) {
  425.                  $desf = $desf + length($items[$b]) + 2;
  426.             }
  427.            
  428.             $scr->at($coor_y1, $coor_x1  + $desf + 2 + $a)->puts("_" x length($items[$a]));
  429.             $scr->at($coor_y1 + 1, $coor_x1 + $desf + 1 + $a)->puts("/" . $items[$a] . "\\");                                              
  430.             if ($a == $puntero) {
  431.                 $espacio = " " x (length($items[$a]) + 2);
  432.                 $scr->at($coor_y1 + 2, $coor_x1 + $desf + $a)->puts("'" . $espacio . "'");
  433.                 $scr->at($coor_y1 + 2, $coor_x1)->puts("/");
  434.             }
  435.        }
  436.        $scr->at($coor_y2 + 1, 0);
  437.        
  438.    }
  439.  
  440.    
  441.    &marco(0, 99, 0, 20, "+-+|+-+| ", "Original:");
  442.    my $opcion1 = menu_v((" Cargar un nuevo archivo ", "Filtrar", " Exportar el archivo "), 2, 38);
  443.    my $opcion2 = menu_h((" Cargar un nuevo archivo ", "Filtrar", " Exportar el archivo "), 8);
  444.    my @items = (['23.3', 'Precio I:', 10, 5, 'n', 5],
  445.                 ['19.2', 'Precio II:', 11, 5, 'n', 5],
  446.                 ['Itaú', 'Nombre del Banco:', 12, 5, 'c', 15],
  447.                 ['18 de Julio 1123', 'Dirección del banco:', 13, 5, 'c', 25],
  448.                 );
  449.    @items = renglones(@items);
  450.    &tabs(("Tab I", "Tab II (largo para ver como ajusta el ancho)", "Tab III"), 1, 0, 0, 20, 100);
  451.    $scr->at(5, 10);
  452.    print "La opción del menu vertical elegida es: " . $opcion1;
  453.    $scr->at(6, 10);
  454.    print "La opción del menu horizontal elegida es: " . $opcion2;
  455.    $scr->at(7, 10);
  456.    print "Item 1: " . $items[0] . "\n";
  457.    $scr->at(8, 10);
  458.    print "Item 2: " . $items[1] . "\n";
  459.    $scr->at(9, 10);
  460.    print "Item 3: " . $items[2] . "\n";
  461.    $scr->at(10, 10);
  462.    print "Item 4: " . $items[3] . "\n";
  463.    $scr->at(22, 10);
  464.  


P.D: el código no está comentado, pero se puede ejecutar y ver los ejemplos.


Nota 2011-02-25 02:53 @162

Perlero Nuevo
Registrado: 2011-02-25 00:15 @052
Mensajes: 2
Re: Ayuda del código
NOTA: Estas funciones fueron creadas para facilitarme una aplicación que necesité. Deben de tener algún bug, y pueden ser mejoradas.

Funciones:
marco:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
   Parámetros:
               1) coordenada 'X' inicial
               2) coordenada 'Y' inicial
               3) coordenada 'X' final
               4) coordenada 'Y' final
               5) caracteres para formar el marco, "+-+|+-+|·"
                             
                  +------------+
                  |············|
                  |············|
                  +------------+

                el noveno carácter es el relleno
               6) Título


menu_v:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
   Parámetros:
               1) Lista de los ítem del menú ej: ("Ítem 1", "ítem 2", ..."ítem n")
               2) coordenada 'Y' donde comienza
               3) coordenada 'X' del centro del menú

   Retorno:    el número de ítem seleccionado


menu_h:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
   Parámetros:
               1) Lista de los ítem del menú ej: ("Ítem 1", "ítem 2", ..."ítem n")
               2) coordenada 'Y' donde se encuentra el menú

   Retorno:    el número de ítem seleccionado


renglones:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
   Parámetros:
   1) Lista de ítem

               Datos que tiene cada ítem:
                       1) El valor a editar , puede tener un valor inicial o no
                       2) La etiqueta de esa entrada
                       3) coordenada 'Y' del ítem
                       4) coordenada 'X' del ítem
                       5) tipo de valor 'n' numérico 'c' caracteres
                       6) número de dígitos del valor, o número de caracteres


tabs:
Syntax: [ Download ] [ Hide ]
Using text Syntax Highlighting
   Parámetros:
                       1) Lista de las lengüetas: ("Ítem 1", "ítem 2", ..."ítem n")
                       2) lengüeta seleccionada
                       3) coordenada 'X' inicial
                       4) coordenada 'Y' inicial
                       5) coordenada 'X' final
                       6) coordenada 'Y' final


Responder al tema  [ 2 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO