2012-08-31 11 views
5

Sto tentando di creare una finestra di dialogo non ridimensionabile con un'etichetta al suo interno. Questa etichetta ha un sacco di testo, quindi lo voglio a wrap senza rendere la finestra di dialogo ridicolmente ampia.GTK Avvolgimento etichetta in una finestra di dialogo

Per qualche motivo, non riesco a scoprire cosa è necessario per far sì che GTK permetta che ciò accada. Non riesco nemmeno a trovare un modo per impostare una larghezza massima nella finestra di dialogo, il che sarebbe fantastico.

Ecco un esempio di esecuzione di quello che voglio dire:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

from gi.repository import Gtk 

class DialogExample(Gtk.Dialog): 

    def __init__(self, parent): 
     Gtk.Dialog.__init__(self, "My Dialog", parent, 0, 
      (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, 
      Gtk.STOCK_OK, Gtk.ResponseType.OK)) 

     self.set_default_size(150, 100) 
     self.set_resizable(False) 

     label = Gtk.Label("This is a dialog to display additional information, with a bunch of text in it just to make sure it will wrap enough for demonstration purposes") 
     label.set_line_wrap(True) 

     box = self.get_content_area() 
     box.add(label) 
     self.show_all() 

class DialogWindow(Gtk.Window): 

    def __init__(self): 
     Gtk.Window.__init__(self, title="Dialog Example") 

     self.set_default_size(250, 200) 


     button = Gtk.Button("Open dialog") 
     button.connect("clicked", self.on_button_clicked) 

     self.add(button) 

    def on_button_clicked(self, widget): 
     dialog = DialogExample(self) 
     response = dialog.run() 

     if response == Gtk.ResponseType.OK: 
      print "The OK button was clicked" 
     elif response == Gtk.ResponseType.CANCEL: 
      print "The Cancel button was clicked" 

     dialog.destroy() 

win = DialogWindow() 
win.connect("delete-event", Gtk.main_quit) 
win.show_all() 
Gtk.main() 

risposta

5

Ho risolto questo (oltre a impostare l'involucro linea True) mettendo il Gtk.Label all'interno di un Gtk.Table, utilizzando il FILL e si restringono e bandiere impostando una larghezza fissa per l'etichetta. Qualcosa di simile a questo:

label = Gtk.Label("This is a dialog to display additional information, with a bunch of text in it just to make sure it will wrap enough for demonstration purposes") 
label.set_line_wrap(True) 
label.set_size_request(250, -1) # 250 or whatever width you want. -1 to keep height automatic 

table = Gtk.Table(1, 1, False) 
table.attach(label, 0, 1, 0, 1, Gtk.AttachOptions.SHRINK | Gtk.AttachOptions.FILL) 

Questo dovrebbe fare il trucco

+0

Scavando un po 'ho capito qual è il problema. Quando crei la finestra/finestra di dialogo e questo non è stato mostrato dalla prima volta che l'etichetta non avrà un riferimento alle dimensioni genitore, quindi Gtk assegna più spazio possibile all'etichetta e quindi imposta la larghezza genitore, risultando in un enorme finestra. Per evitare questo comportamento, impostare la larghezza preferita per il genitore e fare uno spettacolo, in questo modo Gtk calcola la geometria dei genitori e l'etichetta avrà un riferimento reale della dimensione del genitore. L'ho fatto in questo modo e ora tutto funziona come un fascino. – satanas

+0

hi @satanas: hai qualche possibilità di descrivere un po 'più in dettaglio come "imposta la larghezza preferita per il genitore e fai uno spettacolo"? Ho lo stesso problema; l'opzione Gtk.Table è deprecata dalla v3.4, quindi sto cercando una soluzione non deprecata. TIA – fossfreedom

Problemi correlati