PyGTK: Dynamische Etikettenverpackung

Es ist einbekannter Bug / Problem dass eine Beschriftung in GTK die Größe nicht dynamisch ändert, wenn sich das übergeordnete Element ändert. Es ist eines dieser wirklich ärgerlichen kleinen Details, und ich möchte mich, wenn möglich, darum kümmern.

Ich folgte der Annäherung an16 softwareNach dem Haftungsausschluss können Sie ihn jedoch nicht verkleinern. Also habe ich einen Trick ausprobiert, der in einem der Kommentare erwähnt wurdeset_size_request call in the signal callback), aber dies führt zu einer Art Endlosschleife (probieren Sie es aus und sehen Sie).

Hat jemand noch andere Ideen?

(Sie können das Signal nicht nur für die Dauer des Anrufs blockieren, da alsprint Aussagen scheinen darauf hinzudeuten, dass das Problem beginnt, nachdem die Funktion verlassen wurde.)

Der Code ist unten. Sie können sehen, was ich meine, wenn Sie es ausführen und versuchen, das Fenster größer und dann kleiner zu skalieren. (Wenn Sie das ursprüngliche Problem sehen möchten, kommentieren Sie die Zeile nach "Verbinden mit dem Size-Allocation-Signal" aus, führen Sie sie aus und vergrößern Sie das Fenster.)

Die Glade-Datei ("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>

Der Python-Code:

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

Antworten auf die Frage(7)

Ihre Antwort auf die Frage