• Publicidad

Usando tk

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

Usando tk

Notapor jacano » 2007-04-20 07:27 @352

Les planteo una pequeña duda respecto al uso de Tk en perl.


Mi problema es que quiero enviar por un socket info y en el otro lado quiero recibirla y mostrarla en un objeto tipo $caja

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

$ventana = MainWindow->new;
$ventana->title("Jacano");
$ventana->geometry("350x250");


$etiketa = $ventana->LabFrame(-borderwidth => '1',-label=> "Caja",-labelside=> "acrosstop",-relief => 'flat');
$etiketa->pack;


$caja = $etiketa->Text(-borderwidth => '1',-font=> "Tahoma 8 normal",-relief => "solid");
$caja->pack;

MainLoop;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



Mi intención es poder actualizar el contenido de esta caja cada vez que recibo info.

La única manera que conozco de enviar información por un socket es esta.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use IO::Socket;
$sock = IO::Socket::INET->new(PeerAddr=>$ip_conecta,PeerPort=>$puerto,Proto=>'tcp',Timeout=>1);
print $sock "Info enviada a $ip_conecta por puerto $puerto\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y la forma que conozco de recibir esta información es.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use IO::Socket;
$serv = IO::Socket::INET->new(Proto  => 'tcp',LocalPort => $puerto ,Listen=> SOMAXCONN, Reuse => 1);
$conexion_serv = $serv->accept();
if ($msg = <$conexion_serv>) {
                $msg =~ s/\r\n|\n//g;
                 print $msg;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sé que puedo redirigir el print hacia otros sitios como print STDERR pero redirigirlo a una caja de texto usando tk no se hacerlo.

Quizás la manera de enviar la información usando print $socket mensaje no sea la adecuada, ni tampoco la recepción de la misma.
¿Algún otro método para enviar y recibir info a traves de un socket un poco más profesional?

¿Me echáis una mano con el tema de la caja Tk?

gracias.
jacano
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2007-04-17 15:39 @694

Publicidad

Notapor explorer » 2007-04-21 05:42 @279

Puedes reunir la información que llega desde el socket en una variable escalar de esta forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$mensaje .= $msg;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

dentro del bucle. Una vez terminado el bucle o pasado un tiempo asignado a una alarma o por un evento lanzado por el usuario al pulsar un botón o por el timer, escribes el valor de $mensaje en la caja Tk.
http://aspn.activestate.com/ASPN/docs/A ... d/text.htm
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

Notapor jacano » 2007-04-25 06:05 @295

Gracias por la idea explorer!!!

al final he conseguido esto:


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


use Tk;
use IO::Socket;
use threads;

$i=0;
$win= MainWindow->new();
$win->configure(-title =>'Chat');
$win->geometry("550x350");
$texto = $win->Text();
$scroll = $win->Scrollbar(-command => ['yview', $texto])->pack(-side => 'right', -fill => 'y');
$texto->configure(-width => 35,-height=> 7,-font=> 'Tahoma 8 normal',-yscrollcommand => ['set', $scroll]);
$texto->pack(-side => 'left', -fill => 'both', -expand => 1);
&server();
if($i==0){
        threads->create(\&recibe);
}
$i++;

MainLoop;

sub carga{
    $texto = $_[0];
    $texto->insert("end", "$_[1]\n");
}

sub server{
        $puerto = 1337;
        $servidor = IO::Socket::INET->new(Proto  => 'tcp',LocalPort => $puerto ,Listen=> SOMAXCONN, Reuse => 1) or die "Error en server";
        print "Esperando la peticion de conexion del receptor\n";
        $conexion_serv = $servidor->accept();
        print "Aceptada!\n";
}

sub recibe{
        $ip_remoto = $conexion_serv->peerhost;
    do {
            if ($msg = <$conexion_serv>) {
                $msg =~ s/\r\n|\n//g;
                                $msgventa = "\n[Recibido de $ip_remoto:]\n"."$msg\n"."------------------------\n\n";
                                &carga($texto,$msgventa);
                        }
    } until ($msg eq '--salir--');
       
}

 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


espero le sirva a alguien.
jacano
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2007-04-17 15:39 @694

Notapor jacano » 2007-05-02 04:17 @220

Les planteo otra duda respecto al uso de tk con hilos(threads).

Mi objetivo es, teniendo una ventana principal,

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use threads;
use IO::Socket;
use Tk;
use Tk::Dialog;
use strict;

        my $tl;
        my $ventana = MainWindow->new;
        $ventana->title("Jacano threads");
        $ventana->geometry("350x250");

        $ventana->Label(-text => "Uso de threads con tk")->pack;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


un boton que lanza un hilo

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        my $boton_ = $ventana->Button(-activebackground => "#FFFCBF",-activeforeground => "#0000FF", -borderwidth => 1, -text => "Lanza thread",-command => sub{ threads->create(\&proce,$ventana,$tl); }, -cursor=> "", -font => "Tahoma 8 bold", -foreground=> "#140F7B", -relief=> "solid");
        $boton_->pack;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y el MainLoop();

lanzando un hilo a un procedimiento(proce) con los parametros $ventana y $tl que crea una top level windows de $ventana,

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

sub proce {
        #intento crear un top de $ventana
        print "Thread lanzado\n";
        if (! Exists($tl)) {
                $tl = $ventana->Toplevel;
                $tl->title('Top');
                $tl->Button(-text => 'Cierra',-command => sub {$tl->withdraw })->pack;
        }
        else {
                $tl->deiconify;
                $tl->raise;
        }
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


necesito k funcione, el codigo final es este

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

use threads;
use IO::Socket;
use Tk;
use Tk::Dialog;
use strict;

        my $tl;
        my $ventana = MainWindow->new;
        $ventana->title("Jacano threads");
        $ventana->geometry("350x250");

        $ventana->Label(-text => "Uso de threads con tk")->pack;
        my $boton_ = $ventana->Button(-activebackground => "#FFFCBF",-activeforeground => "#0000FF", -borderwidth => 1, -text => "Lanza thread",-command => sub{ threads->create(\&proce,$ventana,$tl); }, -cursor=> "", -font => "Tahoma 8 bold", -foreground=> "#140F7B", -relief=> "solid");
        $boton_->pack;

MainLoop;

sub proce {
        #intento crear un top de $ventana
        print "Thread lanzado\n";
        if (! Exists($tl)) {
                $tl = $ventana->Toplevel;
                $tl->title('Top');
                $tl->Button(-text => 'Cierra',-command => sub {$tl->withdraw })->pack;
        }
        else {
                $tl->deiconify;
                $tl->raise;
        }
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


obtengo un error un tanto raro, uso Active perl sobre win.

en concreto es esto:

Thread lanzado
Thread 1 terminated abnormally: Can't call method "_OnDestroy" on unblessed reference at L:/Perl-5.8.8/lib/Tk/Widget.pm line 391.
at C:\Documents and Settings\practica\Escritorio\threadstk.pl line 28

Alguna idea o ayudita, gracias.

He probado a crear otra ventana (MainWindow) en el procedimiento pero tampoco funciona, tambien he tenido problemas a la hora de manejar $ventana en otros procedimientos que no son lanzados por hilos, me gustaria saber como se maneja correctamente el objeto $ventana y como se envia a otros prcedimientos o hilos para k no tenga problemas.
jacano
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2007-04-17 15:39 @694

Notapor jacano » 2007-05-04 12:29 @561

Veo que nadie me respondio la cuestion, se lo explico de una forma mas clara,

Quiero, desde un hilo crear una top-level-win de un MainWindow que se encuentra en el hilo padre, obtengo errores,alguna solucion, otra forma de desarrollar mi idea??

Gracias.

No debe ser complicado, lo pongo en Intermedio??
jacano
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2007-04-17 15:39 @694

Notapor explorer » 2007-05-04 13:46 @615

Yo no tengo ni idea, pero en este hilo de los perlmonks, se habla de que no puede haber código Tk en un thread:
http://www.perlmonks.org/index.pl?node_id=609432

Es decir, el thread va por una parte y el Tk está en su bucle, esperando o actualizando en pantalla los valores de las variables que sí maneja el thread.

Dice al final: TODO el código Tk debe ir en el thread principal y la comunicación con los threads de trabajo será con simples variables compartidas.

En este otro hilo hay más explicación y más ejemplos de código de Tk y threads:
http://www.perlmonks.org/index.pl?node_id=585533

Espero que te sirva.
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 18 invitados

cron