2012-08-31 27 views
5

Estoy tratando de crear un diálogo no modificable al tamaño con una etiqueta en el mismo. Esta etiqueta tiene una gran cantidad de texto, por lo que quiero que envuelva sin hacer el cuadro de diálogo ridículamente ancho.Etiquetado GTK en un cuadro de diálogo

Por alguna razón, no puedo averiguar qué se necesita para que GTK permita que esto suceda. Ni siquiera puedo encontrar la manera de establecer un ancho máximo en el diálogo, lo cual sería genial.

He aquí un ejemplo de ejecución de lo que quiero decir:

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

Respuesta

5

He resuelto esto (además de establecer el ajuste de línea en True) poner el gtk.Label dentro de un gtk.Table, mediante el relleno y se encogen y banderas establecer un ancho fijo para la etiqueta. Algo como esto:

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) 

Que debe hacer el truco

+0

Excavando un poco me di cuenta de cuál es el problema. Cuando crea la ventana/diálogo y esto no se ha mostrado la primera vez que la etiqueta no tendrá una referencia de tamaño padre, Gtk asigna tanto espacio como puede a la etiqueta y luego establece el ancho principal, lo que da como resultado una gran ventana Para evitar este comportamiento, establezca el ancho preferido para el elemento primario y haga un show, de esta manera Gtk calcula la geometría de los elementos primarios y la etiqueta tendrá una referencia real del tamaño del elemento principal. Lo hice de esta manera y ahora todo está funcionando como un encanto. – satanas

+0

hi @satanas: ¿hay alguna posibilidad de que describas un poco más cómo "estableces el ancho preferido para el padre y haces un espectáculo"? Tengo el mismo problema; la opción Gtk.Table está en desuso desde la v3.4, así que estoy buscando una solución no obsoleta. TIA – fossfreedom

Cuestiones relacionadas