2015-02-16 19 views
11

Ho un set di etichette in un flowbox, il problema è che mi piacerebbe che queste etichette fossero larghe 96px al massimo. Ho impostato label.set_ellipsize (True), ma dal momento che la flowbox offre loro spazio a loro piacimento, non vengono ellissi, anche se ho impostato la dimensione della richiesta su 96px wide.python GTK3 etichetta limite larghezza

problem example

Ho provato tutte le funzioni che ho trovato che sembrava anche solo indirettamente legata a tutti i widget coinvolti, ma nulla sembra funzionare.

l'unica soluzione che ho trovato era usare set_min_children_per_line() ma che richiede il calcolo del numero di bambini dalla larghezza della flowbox che dipende dal numero di figli per riga, che porta a una flowbox che diventa davvero molto veloce.

Probabilmente mi manca qualcosa di ovvio, ma per giorni ho perso la testa su questo problema.

Ho fatto questo testcase che presenta il problema quando quantità di colonne non è divisibile per due:

from gi.repository import Gtk as gtk 
from gi.repository import Pango as pango 

class Widget(gtk.VBox): 
    def __init__(self,label): 
     gtk.VBox.__init__(self) 

     image=gtk.Image.new_from_icon_name("image-missing",gtk.IconSize.DIALOG) 
     image.set_size_request(96,96) 
     self.add(image) 

     lbl=gtk.Label(label) 
     self.add(lbl) 


class TestCase(gtk.Window): 
    def __init__(self): 
     gtk.Window.__init__(self) 
     lbl=gtk.Label("some text") 
     scrollbox=gtk.ScrolledWindow() 
     self.add(scrollbox) 
     flowbox=gtk.FlowBox() 
     scrollbox.add(flowbox) 
     for i in range(50): 
      w=Widget("longlabel"*5) 
      flowbox.add(w) 
      w=Widget("short") 
      flowbox.add(w) 

if __name__=="__main__": 
    w=TestCase() 
    w.connect("delete-event",gtk.main_quit) 
    w.show_all() 
    gtk.main() 
+1

Hai provato ['Gtk.Label.set_max_width_chars (n_chars)'] (https://lazka.github.io/pgi-docs/Gtk-3.0/classes/Label.html#Gtk.Label.set_max_width_chars)? – elya5

+0

L'ho provato. non cambia nulla, e non è quello che voglio in ogni caso. Voglio impostare la larghezza in pixel in modo che corrisponda alle icone. – doxin

+1

Puoi fornire del codice? Forse c'è qualche altra proprietà che si intromette (o per impostazione predefinita o impostata da voi altrove) ... giocare con GtkLabels è sempre divertente xx – andlabs

risposta

5

ecco una soluzione (ancora non l'esatto larghezza in pixel) È possibile utilizzare Gtk. Widget.set_halign per forzare l'assenza di espansione orizzontale.

Ecco la parte del codice:

lbl=gtk.Label(label) 
    lbl.set_max_width_chars(5) 
    lbl.set_ellipsize(pango.EllipsizeMode.END) 
    lbl.set_halign(gtk.Align.CENTER) 
    self.add(lbl) 

Questo è ciò che sembra: screeshot of the window

Spero di non mi manca nulla questa volta.

+0

Gli allineamenti sono ammortizzati. Preferirei non scrivere un nuovo programma con funzionalità deprezzate.non ha ancora la larghezza del pixel, quindi non risolve esattamente il mio problema. – doxin

+1

aggiornato a Gtk.Widget.set_halign – elya5

3

Si ha un'altra opzione: utilizzare un'implementazione GtkContainer personalizzata che limita i suoi figli all'esatta larghezza dei pixel. Secondo Erick Pérez Castellanos su irc.gimp.net/#gtk+, i contatti di GNOME ne hanno uno; here it is. È in Vala, ma non dovrebbe essere troppo difficile da avvolgere attorno a qualche lettura della semantica di GtkWidget e GtkContainer (e GtkBin). Sfortunatamente non so come creare nuovi GObjects in Python, mi dispiace.

Se si utilizza l'approccio in Contatti GNOME, il contenitore personalizzato (che deriva da GtkBin, una comodità per GtkContainer per figlio singolo) contiene solo GtkLabel e lo si aggiunge al GtkVBox dell'oggetto della casella di flusso.

Speriamo che questo aiuti.

Problemi correlati