• Publicidad

Parar cierta función en Tk

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Parar cierta función en Tk

Notapor BigBear » 2010-09-21 19:50 @868

Hola a todos.

Tengo una duda que siempre tuve porque tengo una ventana Tk que en un botón imprime un montón de veces hola mundo y otro que debería parar solo la función, pero no salir del programa.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Tk;

$ven = MainWindow->new;

$ven->Button(-text=>"Conta",-command=>\&contar)->pack();
$ven->Button(-text=>"Para",-command=>\&para)->pack();

MainLoop;

sub contar {
    for (1..99999) {
        $ven->update;
        print "hola mundo";
    }
}

sub para {

}
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Viendo el código no hay una forma de poder hacer lo que quiero.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Parar cierta función en Tk

Notapor explorer » 2010-09-22 06:04 @294

Te podría servir utilizar una variable global que controle el proceso de pintado:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use Tk;
  7.  
  8. my $contar = 0;
  9.  
  10. my $ven = MainWindow->new;
  11.  
  12. $ven->Button(-text => "Conta", -command => \&contar)->pack();
  13. $ven->Button(-text => "Para",  -command => \&parar) ->pack();
  14.  
  15. MainLoop;
  16.  
  17. sub contar {
  18.     $contar = 1;
  19.  
  20.     for (1 .. 99999) {
  21.  
  22.         $ven->update;
  23.  
  24.         return if not $contar;
  25.  
  26.         print "hola mundo ";
  27.     }
  28. }
  29.  
  30. sub parar {
  31.     $contar = 0;
  32. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Parar cierta función en Tk

Notapor BigBear » 2010-09-23 09:35 @441

Hola explorer, gracias por tu respuesta, pero tengo otra duda, ¿cómo puedo hacer lo mismo que me enseñaste a hacer en el anterior post pero sin que haya el botón "Parar", sino que con presionar de nuevo el botón contar se pare si es que estaba activado?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Parar cierta función en Tk

Notapor explorer » 2010-09-23 12:24 @558

Una solución sencilla sería incorporar el interruptor en la misma llamada del botón:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use Tk;
  7.  
  8. my $contar = 0;
  9.  
  10. my $ven = MainWindow->new;
  11.  
  12. $ven->Button(-text => "Conta", -command => \&contar)->pack();
  13.  
  14. MainLoop;
  15.  
  16. sub contar {
  17.     $contar = !$contar;          # le damos al interruptor de la luz
  18.  
  19.     while ($contar) {            # si la bombilla está encendida...
  20.  
  21.         $ven->update;
  22.  
  23.         print "hola mundo ";
  24.     }
  25. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De todas maneras, la solución "profesional", sería usando POE. Hay un ejemplo que muestra un contador parecido a lo que quieres hacer, pero usando la multitarea de POE.

Es muy posible que exista otra solución para este problema, usando Perl y Tk. El problema es conciliar la ejecución de un bucle infinito con la ejecución de los eventos lanzados por el usuario. En la solución que te doy, el usuario, cuando pulsa dos veces el botón de Contar, estamos realmente lanzando dos veces la rutina de contar(). Pero el resultado es que funciona como esperamos porque cuando el usuario quiere parar la presentación (en la segunda pulsación), cambiamos la bandera (o semáforo), y eso hace que los dos while() (de las dos llamadas a la función contar()) fallen, por lo que terminan enseguida. Pero esto no quiere decir que exista una multitarea real.

Lo dicho, es mejor usar POE para estos casos de multitarea. O quizás una solución con fork() o con Threads.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Parar cierta función en Tk

Notapor BigBear » 2010-09-23 17:35 @774

Explorer, ¿me podrías decir cuál es el error del código porque no me para el script cuando lo quiero cancelar como en tu código anterior?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use warnings;
  2. use diagnostics;
  3.  
  4. use Tk;
  5.  
  6. my $contar = 0;
  7.  
  8. my $ven = MainWindow->new;
  9.  
  10. $ven->Button(-text => "Conta", -command => \&contar)->pack();
  11.  
  12. MainLoop;
  13.  
  14. sub contar {
  15.     $contar = !$contar;
  16.     while ($contar) {
  17.         $ven->update;
  18.  
  19.         for (1..11111) {
  20.             $ven->update;
  21.             print "hola mundo ";
  22.         }
  23.     }
  24. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Parar cierta función en Tk

Notapor explorer » 2010-09-23 17:46 @781

El problema es que no tienes puesto un control de parada de bucle dentro del bucle for().

Podrías poner una línea con un return() como te he indicado antes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados