2012-08-31 7 views
5

Ich versuche, einen nicht-resizierbaren Dialog mit einem Etikett darin zu erstellen. Dieses Etikett hat viel Text, also möchte ich es wickeln, ohne den Dialog lächerlich breit zu machen.GTK Label-Wrapping in einem Dialogfeld

Aus irgendeinem Grund kann ich nicht herausfinden, was es braucht, damit GTK dies ermöglicht. Ich kann nicht einmal eine Möglichkeit finden, eine maximale Breite auf dem Dialog einzustellen, was großartig wäre.

Hier ein aktuelles Beispiel von dem, was ich meine:

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

Antwort

5

ich dieses Problem gelöst (neben den Zeilenumbruch auf True setzen), um die Gtk.Label in einem Gtk.Table setzen, die FILL mit und Shrink-Flaggen und Festlegen einer festen Breite für das Etikett. Etwas wie folgt aus:

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) 

, die den Trick

+0

ein wenig Graben bis ich begriff, was das Problem ist. Wenn Sie das Fenster/den Dialog erstellen und dies nicht zum ersten Mal angezeigt wurde, hat die Beschriftung keine übergeordnete Größenreferenz, daher weist Gtk der Beschriftung so viel Platz wie möglich zu und legt dann die übergeordnete Breite fest, was zu a führt großes Fenster. Um dieses Verhalten zu vermeiden, legen Sie die bevorzugte Breite für das übergeordnete Element fest und führen Sie eine Show aus. Auf diese Weise berechnet Gtk die Elterngeometrie, und die Beschriftung hat eine echte Referenz der Größe des übergeordneten Elements. Ich habe es so gemacht und jetzt funktioniert alles wie ein Zauber. – satanas

+0

hi @satanas - jede Chance, die du ein bisschen weiter beschreiben kannst, wie du "die bevorzugte Breite für das Elternteil einrichtest und eine Show machst"? Ich habe das gleiche Problem; Die Gtk.Table-Option ist seit v3.4 veraltet, daher suche ich nach einer nicht veralteten Lösung. TIA – fossfreedom

Verwandte Themen