PyGTK: ajuste dinámico de etiquetas

Es unerror conocido / problema que una etiqueta en GTK no se redimensionará dinámicamente cuando cambie el padre. Es uno de esos pequeños detalles realmente molestos, y quiero hackearlo si es posible.

Seguí el enfoque en16 software, pero de acuerdo con el descargo de responsabilidad, no puede cambiar su tamaño más pequeño. Así que intenté un truco mencionado en uno de los comentarios (elset_size_request llamar en la señal de devolución de llamada), pero esto resulta en una especie de bucle infinito (pruébelo y vea).

¿Alguien tiene alguna otra idea?

(No puede bloquear la señal solo por la duración de la llamada, ya que comoprint Las declaraciones parecen indicar que el problema comienza después de que se deja la función.)

El código está abajo. Puede ver a qué me refiero si lo ejecuta e intenta cambiar el tamaño de la ventana para que sea más grande y luego más pequeña. (Si desea ver el problema original, comente la línea después de "Conectar a la señal de asignación de tamaño", ejecútelo y cambie el tamaño de la ventana).

El archivo Glade ("example.glade"):

<?xml version="1.0"?>
<glade-interface>
  <!-- interface-requires gtk+ 2.16 -->
  <!-- interface-naming-policy project-wide -->
  <widget class="GtkWindow" id="window1">
    <property name="visible">True</property>
    <signal name="destroy" handler="on_destroy"/>
    <child>
      <widget class="GtkLabel" id="label1">
        <property name="visible">True</property>
        <property name="label" translatable="yes">In publishing and graphic design, lorem ipsum[p][1][2] is the name given to commonly used placeholder text (filler text) to demonstrate the graphic elements of a document or visual presentation, such as font, typography, and layout. The lorem ipsum text, which is typically a nonsensical list of semi-Latin words, is a hacked version of a Latin text by Cicero, with words/letters omitted and others inserted, but not proper Latin[1][2] (see below: History and discovery). The closest English translation would be "pain itself" (dolorem = pain, grief, misery, suffering; ipsum = itself).</property>
        <property name="wrap">True</property>
      </widget>
    </child>
  </widget>
</glade-interface>

El código de Python:

#!/usr/bin/python

import pygtk
import gobject
import gtk.glade

def wrapped_label_hack(gtklabel, allocation):
    print "In wrapped_label_hack"
    gtklabel.set_size_request(allocation.width, -1)
    # If you uncomment this, we get INFINITE LOOPING!
    # gtklabel.set_size_request(-1, -1)
    print "Leaving wrapped_label_hack"

class ExampleGTK:

    def __init__(self, filename):
        self.tree = gtk.glade.XML(filename, "window1", "Example")
        self.id = "window1"
        self.tree.signal_autoconnect(self)

        # Connect to the size-allocate signal
        self.get_widget("label1").connect("size-allocate", wrapped_label_hack)

    def on_destroy(self, widget):
        self.close()

    def get_widget(self, id):
        return self.tree.get_widget(id)

    def close(self):
        window = self.get_widget(self.id)
        if window is not None:
            window.destroy()
        gtk.main_quit()

if __name__ == "__main__":
    window = ExampleGTK("example.glade")
    gtk.main()

Respuestas a la pregunta(7)

Su respuesta a la pregunta