• Publicidad

Perl Gtk2::ProgressBar

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

Perl Gtk2::ProgressBar

Notapor Falkom » 2012-03-13 08:43 @405

Hola a todos:

Tengo problemas para entender cómo funciona el componente ProgressBar. Pongo en antecedentes: después de una serie de acciones, modulo4 va a invocar a modulo5. Resulta que puede procesar hasta 1000 ficheros y por supuesto, te puedes morir esperando. Por lo tanto, he pensado en el desarrollo de un ProgressBar a fin de que la gente sepa que estamos vivos. Este ProgressBar, lo he implementado en un GtkDialog llamado modulo5.

Pensé que lo tenía claro pero se me queda la pantalla estática en modulo5, aparece los valores por defecto, es decir, "Copiando el fichero... " en el label y 0.00% en la barra y no hace absolutamente nada.

Por favor, ¿alguien me puede echar un cable?

Muchas gracias.
Falkom
P.D.: Los widget los estoy haciendo con Glade por si puede dar una pista.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub on_modulo_4_btn_adelante_clicked {
  2.         $vmodulo_4->hide();
  3.         $modulo_5_pbar->set_orientation('left-to-right');
  4.         $modulo_5_pbar->set_text("0.00%");
  5.         $modulo_5_label->set_markup("Copiando el fichero... ");
  6.         $vmodulo_5->show_all();
  7.  
  8.  
  9.  
  10.         my @ficheros = $vmodulo_2->get_filenames;
  11.         my $total_ops = @ficheros;
  12.         my $increment = 1 / $total_ops;
  13.         my $fraction = $modulo_5_pbar->get_fraction;
  14.         for (my $i = 0; $i < @ficheros; $i++) {
  15.                 if (!$vmodulo_5->run) {
  16.                         $vmodulo_5->destroy;
  17.                         return;
  18.                 }
  19.                 if ($fraction <= 1.0) {
  20.                         $modulo_5_pbar->set_fraction($fraction);
  21.                         $fraction += 0.01;
  22.                 }
  23.                 while (Gtk2->events_pending) {
  24.                         Gtk2->main_iteration;
  25.                 }
  26.                 Gtk2::Gdk->flush;
  27.        
  28.                 $modulo_5_label->set_markup("Copiando el fichero... " . $ficheros[$i]);
  29.                 $modulo_5_pbar->set_text($fraction);
  30.                 copiar($ficheros[$i]); 
  31.         }
  32.  
  33. }
  34.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Falkom
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-03-09 04:30 @229

Publicidad

Re: Perl Gtk2::ProgressBar

Notapor explorer » 2012-03-13 10:27 @477

En los ejemplos que me da Google, solo es necesario llamar a fraction() para que la barra de progreso se actualice. No es necesario llamar a flush().

Por ejemplo, Progress Bars. Ahí también se indica que el uso más normal con las barras de progreso es con temporizadores u operaciones de E/S. Y el ejemplo mostrado usa un temporizador $pbar->{timer} = Glib::Timeout->add(100, \&progress_timeout, $pbar); para animar la barra.

Una cosa importante: si queremos que Gtk2 se ocupe de animar los controles, debemos haber entrado en el bucle principal con Gtk2->main; , pero, claro... si entramos ahí, no podemos hacer otra cosa que queremos, que es hacer la copia de los archivos. Por esa razón, en tu código, en lugar de llamar a main(), usas las llamadas events_pending y main_iteration. Justamente ahí es donde Gtk2 actualizará el aspecto de la barra (que ha sido actualizado en la línea 20 con la llamada a set_fraction).

Dices que no hace nada. ¿Al menos realiza la copia de los archivos?
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: Perl Gtk2::ProgressBar

Notapor Falkom » 2012-03-14 03:10 @174

Estimado Explorer,

Lo primero de todo es darte las gracias por tu ayuda. Lo segundo es algo que no acabo de entender. Se muestra el módulo 5 y cada vez que le doy a cerrar la ventana, salta a una nueva fracción de barra y muestra qué fichero está copiando en ese momento. Lo curioso es que no lo hace seguido sino cerrando la ventana, ya que esta vuelve a aparecer y muestra el siguiente resultado de bucle.

Un abrazo y gracias de nuevo.


Falkom
Falkom
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-03-09 04:30 @229

Re: Perl Gtk2::ProgressBar

Notapor explorer » 2012-03-14 06:50 @326

Yo he manejado muy poco el Gtk2, así que me tengo que fiar de lo que dice la documentación.

Así, dice que Gtk2:Gdk->flush() se usa muy poco, ya que lo que hace es vaciar el búfer de las X y esperar hasta que el servidor X haya terminado. Que es muy raro usarlo, y que, desde luego, no funciona en Windows, porque en Windows no hay X.

Y no sé para qué están las líneas 15 a 17.

¿Has copiado el código desde otro sitio?
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: Perl Gtk2::ProgressBar

Notapor Falkom » 2012-03-15 07:14 @343

Gracias, explorer. Al final, he tirado por la calle del medio y me he complicado lo justo. Tal como decías, miro si hay eventos pendientes y lanzo un set_fraction().

Gracias.
Falkom
Perlero nuevo
Perlero nuevo
 
Mensajes: 12
Registrado: 2012-03-09 04:30 @229


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 20 invitados