PyGTK: dynamiczne owijanie etykiet

To jestznany błąd / problem że etykieta w GTK nie zmieni dynamicznie rozmiaru po zmianie rodzica. To jeden z tych naprawdę irytujących drobnych szczegółów i chcę go okraść, jeśli to możliwe.

Podążyłem za podejściem w16 oprogramowanie, ale zgodnie z zastrzeżeniem nie możesz zmienić rozmiaru na mniejszy. Spróbowałem więc sztuczki wspomnianej w jednym z komentarzy (set_size_request wywołanie w wywołaniu zwrotnym sygnału), ale skutkuje to pewnego rodzaju nieskończoną pętlą (wypróbuj i zobacz).

Czy ktoś ma jakieś inne pomysły?

(Nie możesz zablokować sygnału tylko na czas trwania połączenia, ponieważ jakoprint zdania wydają się wskazywać, że problem zaczyna się po pozostawieniu funkcji.)

Kod jest poniżej. Możesz zobaczyć, co mam na myśli, jeśli go uruchomisz i spróbujesz zmienić rozmiar okna na większe, a następnie mniejsze. (Jeśli chcesz zobaczyć oryginalny problem, skomentuj wiersz po „Połącz z sygnałem przydzielania rozmiaru”, uruchom go i zwiększ rozmiar okna.)

Plik 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>

Kod Pythona:

#!/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()

questionAnswers(7)

yourAnswerToTheQuestion