• Publicidad

GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

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

GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor darkladen » 2011-04-27 13:21 @598

Hola a todos.

Llevo algún tiempo haciendo cosas con Perl pero ahora quiero crear interfaces con GTK2.

En esta primera, lo que intento es crear una especie de player multiformato en el que pueda embeber Mozilla y MPlayer.

He logrado usar ambos en una misma ventana pero lo que no he logrado (he probado con frames, hbox, vbox y otros) es que si quiero, por ejemplo, ver un vídeo, se oculte la instancia de Mozilla y haga visible la instancia de MPlayer y reproducir el vídeo definiendo la duración de esta exhibición, y al terminar este tiempo, poder ocultar el MPlayer y mostrar Mozilla para cargar una página.

No he logrado poner ambas instancias maximizadas dentro de la ventana pero al mismo tiempo solo mostrando una de éstas (por ejemplo, solo ver Mozilla con una página web) y con algún evento interno pasarle un vídeo y que automáticamente se oculte Mozilla y se muestre MPlayer reproduciendo el vídeo durante un tiempo definido, y cuando termine, ocultar MPlayer y mostrar Mozilla con una página web.

Espero puedan guiarme un poco en el mundo de GTK y Perl, que hasta el momento me encanta un montón por la infinidad de cosas que podría hacer.

Desde ya, muchas gracias.
darkladen
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-04-08 16:43 @738

Publicidad

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor darkladen » 2011-04-28 17:24 @766

Bueno, hasta el momento he logrado definir el tiempo de exhibición de cada instancia (Mozilla y MPlayer) embebida en una ventana usando "AnyEvent". Mi problema es que aún no logro manejar, las dos instancias en una misma ventana.

He intentado cargar ambas instancias en una ventana pero no me deja porque no se puede cargar más de un widget en una ventana, he probado también cargar cada instancia en un vbox y seguido, cargar ambos vbox dentro de una ventana y me da el mismo problema que no me deja agregar más de un widget a la ventana.

Podría cargar ambas instancias en una vbox pero esa caja quedaría dividida entre ambas instancias y necesito que estén cada una al 100% del vbox.

Estoy viendo ejemplos con frames y notebook pero aún no me queda claro su funcionamiento.

¿Alguien me podría decir cómo cargar dos widget en una ventana y ambos widget usando el 100% de la ventana de tal forma que al ocurrir cierto evento se haga visible uno y oculte el otro y viceversa ???

Espero me puedan ayudar,
Gracias.
darkladen
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-04-08 16:43 @738

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor explorer » 2011-04-28 17:37 @775

Bienvenido a los foros de Perl en español, darkladen.

No he mirado mucho la programación con Gtk2, pero, ¿no tienen los widgets una opción de ocultar los componentes? Si fuera posible, ocultarías uno y harías visible el otro. O quizás otra posibilidad (que tampoco sé si se puede hacer), es colocar los dos widgets uno encima del otro, y haces visible al de arriba según lo necesites.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor darkladen » 2011-04-29 12:24 @558

Gracias, explorer, por responder.

La verdad he estado haciendo pruebas pero no veo la forma de posicionar ambos widget en una vbox al 100% ambos y solo controlar los estados "show" y "hide" o por ejemplo, cambiar las dimensiones de un widget de tal forma que pueda dejarlo de tamaño 1x1 y al mismo tiempo "hide" y el otro widget dejarlo de tamaño 100%x100% y "show" pero tampoco me ha funcionado.

He visto en algunos ejemplos una forma de tener widget como tabs y al presionar un tab se muestra un frame relacionado pero aún no logro dar con la forma correcta de implementarlo.

Seguiré investigando pero agradeceré cualquier ayuda.

Muchas gracias.
darkladen
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-04-08 16:43 @738

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor darkladen » 2011-05-02 13:49 @617

Bueno, he vuelto, después de investigar bastante y hacer pruebas, he encontrado la solución a mi problema.

Resulta que la solución era bastante fácil (pero claro, mientras no se encuentra sigue siendo difícil).

Cuando agregaba widgets a "vbox" de la forma "$vbox->pack_start($moz, TRUE, TRUE, 0);" no tenía problemas cuando era sólo un widget ya que conseguía que éste ocupara la caja completa, cuando agregaba un segundo widget con las mismas propiedades, ocurría que ambos widget se ajustaban al 50% de la "vbox" y no lograba ver sólo uno al 100%; entonces haciendo pruebas agregué ambos widget de la forma que mostré arriba y el primero lo dejaba "show" y el segundo "hide" y mágicamente la "vbox" expandía el único widget visible al 100% y al ocultarlo y hacer visible el segundo widget que estaba oculto se producía el efecto de intercambio de ventanas.

Finalmente eso es lo que necesito y funciona a la perfección.

La pregunta que tengo ahora es ¿cómo puedo hacer un ciclo el cual comience una vez se recupere un archivo "playlist.xml" para cambiar los contenidos exhibidos?

En este minuto lo que he hecho es usar AnyEvent de la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $players = 0;
  2. my $w = AnyEvent->timer(interval => 20, cb => sub {
  3.    $players++;
  4.    if (($players % 2) eq 0) {
  5.       $moz->load_url("http://string_url");
  6.       $moz->show;
  7.       $mpe->stop;
  8.       $mpe->hide;
  9.    } else {
  10.       $moz->hide;
  11.       $mpe->stop;
  12.       $mpe->play("ruta_video");
  13.       $mpe->show;
  14.    }
  15. });
  16.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Mi idea es poder modificar el "interval" en cada loop para poder definir la duración por cada contenido. La duración sería un parámetro que recupero del archivo "playlist.xml".

¿¿¿ Alguna idea ???

Desde ya, muchas gracias.
darkladen
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-04-08 16:43 @738

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor darkladen » 2011-05-03 14:11 @632

¿¿¿ Alguien podría ayudarme ???
darkladen
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-04-08 16:43 @738

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor explorer » 2011-05-03 18:21 @806

Parece que hay pocos expertos de GTK2/AnyEvent, por estos foros :(
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor darkladen » 2011-05-04 08:28 @394

Sí, he estado revisando mucho Google, formulando búsquedas de lo más extrañas pero aún no encuentro nada concreto. Seguiré buscando...

Gracias.
darkladen
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-04-08 16:43 @738

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor darkladen » 2011-05-04 12:52 @578

Bueno, por acá ando de nuevo posteando mi solución.

La Tarea: buscar la forma de cargar un archivo XML que contiene información de archivos multimedia, pasarlo a hash (XML::Simple -> XMlin) y recorrer este arreglo de tal forma que pueda leer cada registro en el hash. Al leer cada registro, uno de los datos es la duración del archivo. Este dato (duración) lo usaría para hacer pausas dentro de AnyEvent mientras se reproduce el archivo. Una vez concluida esta pausa leería el siguiente registro y haría nuevamente la misma tarea de forma cíclica.

El Problema: No lograba hacer las pausas dentro de AnyEvent y por lo tanto no encontraba la forma de hacer el intercambio de archivo a reproducir.

La Solución: Crear un evento timer "AnyEvent->timer" con un intervalo de 0.5 s y una función interna "cb => sub {}" que lleve un conteo de la duración, que sería la suma del intervalo por cada ciclo que pase ($suma_intervalo += $intervalo) y que compare este valor con el dato "duración" del registro actual tomado. Una vez se cumpla la condición, se pasa al siguiente registro y recogemos la ruta del archivo y su duración, se resetea $suma_intervalo" y se carga el contenido en el widget de vídeo junto a un par de ajustes adicionales. Lo siguiente es que se repita el ciclo.

Bueno este sería mi aporte. Quizá no esté muy depurado y/u optimizado pero es un primer paso y funciona bastante bien. Se pueden agregar muchas más cosas pero ya depende de la necesidad de cada uno.

Saludos y gracias.

PD: cuando digo "hacer pausas dentro de AnyEvent" me refiero a que AnyEvent seguirá avanzando pero ciertas operaciones no se ejecutarán dentro de él mientras no se cumplan algunas condiciones. Así puedo ejecutar varias tareas con tiempo definido sólo si se cumple esta condición.
darkladen
Perlero nuevo
Perlero nuevo
 
Mensajes: 15
Registrado: 2011-04-08 16:43 @738

Re: GTK2 - Una Ventana, 2 widget (mplayer, mozilla)

Notapor explorer » 2011-05-04 14:32 @647

Lo ideal sería... que el reproductor mande una señal a nuestro programa, indicando qué es lo que está reproduciendo o si ha terminado.

Según el manual de MPlayer hay una serie de opciones que permiten comunicarse con MPlayer:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
       -udp-ip <ip>
              Sets  the  destination  address  for datagrams sent by the -udp-master.
              Setting it to a broadcast address allows multiple slaves having the same
              broadcast address to sync to the master (default: 127.0.0.1).

       -udp-master
              Send a datagram to -udp-ip on -udp-port just before playing each frame.
              The datagram indicates the master's  position  in the file.

       -udp-port <port>
              Sets the destination port for datagrams sent by the -udp-master, and the
              port a -udp-slave listens on (default: 23867).

       -udp-seek-threshold <sec>
              When  the master seeks, the slave has to decide whether to seek as well,
              or to catch up by decoding frames without pausing between frames.  If
              the master is more than <sec> seconds away from the slave, the slave
              seeks.  Otherwise, it  "runs" to catch up or waits for the master. This
              should almost always be left at its default setting of 1 second.

       -udp-slave
              Listen on -udp-port and match the master's position.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Más información: [MPlayer-users] controlling multiple instances of MPlayer (Win7)

Otra cosa... si sabemos la duración de las reproducciones, entonces sabemos en qué momento parará (sumamos el tiempo actual (con time()) con la duración). Así, no hay que mirar cada poco tiempo en qué situación estamos.

Bueno, son solo ideas...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron