PyGTK: dynamischer Etikettenumbruch

8

Es ist ein bekannter Fehler / Problem , dass eine Beschriftung in GTK nicht dynamisch geändert wird, wenn sich der Parent ändert . Es ist eines dieser wirklich nervigen kleinen Details, und ich möchte es wenn möglich hacken.

Ich habe den Ansatz bei 16 Software verfolgt, aber gemäß dem Disclaimer können Sie die Größe nicht ändern es ist kleiner. Also habe ich einen Trick versucht, der in einem der Kommentare erwähnt wurde (der set_size_request Aufruf im Signal Callback), aber dies führt zu einer Art Endlosschleife (probiere es und sieh).

Hat jemand noch andere Ideen?

(Sie können das Signal nicht nur für die Dauer des Aufrufs blockieren, da, wie die print -Anweisungen zu zeigen scheinen, 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 verkleinern. (Wenn Sie das ursprüngliche Problem sehen möchten, kommentieren Sie die Zeile nach "Connect to the size-allocate signal", führen Sie sie aus und ändern Sie die Größe des Fensters.)

Die Glade-Datei ("example.glade"):

%Vor%

Der Python-Code:

%Vor%     
detly 12.12.2009, 15:24
quelle

7 Antworten

3

VMware libview hat ein Widget namens WrapLabel , das tun sollte, was Sie wollen, aber es ist in C ++. Eine Python-Übersetzung ist im Meldungs-Repository verfügbar (getrennt von busybox.py ).

    
Kai 15.12.2009, 23:20
quelle
4

Hier ist eine Ein-Zeilen-Variante der Lösung von killown:

%Vor%

Das obige wird sicherstellen, dass das Label die ihm zugewiesene Breite annimmt, so dass das Umbrechen glücklich ist.

Nicht sicher, warum es eine "-1" für die Breite gibt, aber es scheint harmlos!

    
Tal Liron 12.09.2011 21:24
quelle
3

Beispiel für die Größenänderung und Umbruch der Beschriftung dynamisch:

BEARBEITEN:

%Vor%     
killown 09.09.2010 04:00
quelle
2

Sie können dies verwenden. Nicht sicher, woher es ursprünglich kam. Erstellen Sie Ihr Label und rufen Sie label_set_autowrap (label)

auf %Vor%     
Rob 06.01.2010 22:34
quelle
1

In GTK 3 wird dies automatisch mit Größenanforderungen für Höhe und Breite und Breite für Höhe durchgeführt.

    
ptomato 13.09.2011 05:48
quelle
1

Ich wollte nur teilen, wie ich Kai's Lösung mit PyGtk und Glade-3 arbeiten ließ, indem ich wraplabel.py .

Ich wollte Glade-Kataloge nicht ändern müssen, um WrapLabel in Glade zu bekommen, und ich bin mir nicht sicher, ob das mit einer PyGtk-Komponente überhaupt funktionieren würde. Ich war jedoch angenehm überrascht, dass die Klasse WrapLabel einfach in die Python-Umgebung gestellt wird, bevor sie in gtk.Bilder () aufgerufen wird, um die Klasse als Komponente zu laden.

Nun war das einzige Problem, die WrapLabels in die Glade-Datei zu bekommen. Zuerst änderte ich die Namen aller Labels, die ich in wlabel ### umbrechen wollte, wobei ### eine Zahl ist. Dann habe ich einen sed-Ausdruck verwendet, um die Klassen zu ersetzen, aber da ich dem Build-System keine zusätzliche Verarbeitung hinzufügen wollte, fügte ich folgendes in python hinzu:

%Vor%

Ich bin mir sicher, dass es elegantere Möglichkeiten gibt, die Substitution durchzuführen, aber das hat gut funktioniert. Ich stellte jedoch fest, dass ich noch ein Problem hatte. Als ich einen der Dialoge mit den eingepackten Etiketten öffnete, war ein Teil des Textes nicht sichtbar. Dann, wenn ich das Fenster mit der Maus, sogar ein bisschen, änderte, würde alles an Ort und Stelle einrasten. Einige, wie die Etiketten bei der Initialisierung nicht die richtigen Größen erhielten. Ich habe das mit einer anderen Arbeit behoben. Wenn ich einen der Dialoge öffne, führe ich diesen Code aus:

%Vor%

Dies setzt die Größe nur um einen Punkt zu groß, stellt das Fenster dar und wird dann auf die richtige Größe zurückgesetzt. Auf diese Weise erhalten die WrapLabels das Signal zur Größenänderung, nachdem das Dialoglayout abgeschlossen ist.

Es gibt immer noch einen kleinen Fehler. Wenn Sie den Dialog manchmal öffnen, können Sie den einzufangenden Text sehen. Ansonsten scheint es zu funktionieren.

HINWEIS 1) Alle Variationen des Aufrufs label.set_size_request (size.width - 1, -1) auf size-allocate führten dazu, dass die GUI für mich gesperrt wurde. Wahrscheinlich hängt es von den übergeordneten Widgets ab.

ANMERKUNG 2) Eine andere Lösung besteht darin, TextViews zu verwenden und die Bearbeitung, den Cursor und die Empfindlichkeit zu deaktivieren. TextViews haben jedoch eine andere Farbe als der Hintergrund, der im Hinblick auf Gtk-Themes schwer zu beheben ist. Das andere Problem mit dieser Lösung ist, dass TextViews Maus Scroll-Ereignisse erfassen. Dies macht Maus scrollen eine Box mit diesen TextViews in ihm sehr unberechenbar. Ich habe viele Dinge versucht, um das Maus-Scroll-Problem zu lösen, habe es aber nie herausgefunden. Ansonsten funktioniert die Verwendung von TextViews. Sie können dies also berücksichtigen, wenn sich Ihre Textbeschriftungen nicht in einem Bildlauffenster befinden und die WrapLabel-Lösung nicht für Sie funktioniert.

    
jcoffland 01.10.2011 21:29
quelle
0

Ich habe den Code geändert, der in den anderen Antworten war, um einen Callback zu erhalten, der sich etwas besser verhielt:

%Vor%

Die Zahlen -20 und +6 wurden durch Versuch und Irrtum erhalten. Es wäre nett, sie von irgendwo in den Widgets zu bekommen, aber ich konnte keine Beziehung zu den Widgets finden. Dadurch wird die Größe des Etiketts sowohl beim Wachsen als auch beim Schrumpfen fein und Linien werden nicht geschnitten.

    
Marga Manterola 05.09.2012 16:33
quelle

Tags und Links