enero 07, 2014

Notas gtk: Redimensionar ventana cuando una elemento se oculta y es re-mostrado

Por lo general cuando una ventana es lanzada, tiene un tamaño determinado, o bien es de tamaño "Natural", o con un tamaño especificado o con valores default que le podemos asignar.

Sea el caso que tenemos un elemento como un textView con barras de desplazamiento que lo ocultamos y lo mostramos según conveniencia y que nuestra ventana principal tiene valores default (150*50, suponiendo que trabajemos con glade). Lo que sucedera sera lo siguiente:

1. Ventana lanzada con el textView oculto entre el button y el progressbar:


2. Al hacer clic en el button, mostramos el textView oculto:

3. Al hacer de nuevo clic en el button, ocultamos el textView:
El problema es que la ventana principal no retoma el tamaño inicial (el default que le dimos), "no lo recuerda".

Para solucionar ello podemos usar dos propiedades resize() y get_default_size(). resize() será para indicarle el tamaño que debe tomar pasandole como parametro un width y un height. get_default_size() devuelve una tupla con width y height especificados como valores default (suponiendo que lo declaraste en glade). Entonces la solución es simple, bastará con combinar ambas propiedades para solucionar el problema de redimensionado.

Para verlo mejor, les dejo código de ejemplo para PyGTK (de aqui pueden adaptarlo a las nuevas tecnologías de PyGI)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import gtk

class Test(object):

    def __init__(self):
        # Se carga el archivo glade con la ventana
        builder = gtk.Builder()
        builder.add_from_file('test.glade')

        # Se recuperan los widget a usar (no son necesarios todos)
        self.winMain = builder.get_object('winMain')
        self.textview = builder.get_object('textview1')
        self.scrolledwindow1 = builder.get_object('scrolledwindow1')

        # Se asocian las señales del archivo glade a metodos de la clase
        self.winMain.connect("destroy", lambda x: gtk.main_quit())
        builder.connect_signals(self)

        # Mostramos la ventana principal
        self.winMain.show()

        texto="algo 01\nalgo 02\nalgo 03\nalgo 04\nalgo 05\nalgo 06\n"
        self.textview.get_buffer().set_text(texto)
        self.scrolledwindow1.set_visible(False)
       
    def on_button1_clicked(self, widget):
        if self.scrolledwindow1.get_visible():
            self.scrolledwindow1.set_visible(False)
            self.winMain.resize(self.winMain.get_default_size()[0], self.winMain.get_default_size()[1])
        else:
            self.scrolledwindow1.set_visible(True)

# Esto solo se ejecuta cuando es llamado como programa principal
if __name__ == '__main__':
    Test()
    gtk.main()



Nota: Lo que ocultamos es el elemento superior al textView, en este caso será la barra de desplazamiento.

No hay comentarios:

Publicar un comentario