ComboBox soll Elternwidget ausdehnen

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

Mein GUI enthält eine ComboBox, deren Inhalt dynamisch erzeugt wird, die benötigte Breite steht also noch nicht fest. Wird der ComboBox Inhalt eingefügt, so verbreitert sich die ComboBox um den benötigten Platz. Die Elternwidgets bleiben aber leider unverändert, so dass man das Fenster manuell verbreitern muss, um den Inhalt der ComboBox lesen zu können. Ich habe mit diversen Attributen der einzelnen Widget versucht zu erreichen, dass die Elternwidgets der Breitenänderung der ComboBox automatisch folgen, bislang aber erfolglos.

Ich würde mich über jeden Tipp freuen, wie ich das erreichen kann. Vielen Dank!

Code: Alles auswählen

#!/usr/bin/python
#-*- coding: utf-8 -*-
 
import gtk
 
class probe(object):
    def __init__(self):
        """ Initialisiert das Fenster """
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_border_width(5)
        self.window.set_default_size(350, 100)
        self.window.connect('delete_event', self.event_delete)
        self.window.connect('destroy', self.destroy)
        self.window.show()        
        
        canvas = gtk.VBox(False, 0)
        canvas.show()
        self.window.add(canvas)
        
        notebook = gtk.Notebook()
        notebook.show()
        canvas.add(notebook)

        tab1 = gtk.VBox(False, 5)
        tab1.show()        
        
        viewport = gtk.Viewport()
        viewport.show()
        
        align = gtk.Alignment(1, 1, 1, 1)
        vbox = gtk.VBox(False, 5)
        vbox.show()
        align.show()
        align.set_padding(5, 5, 5, 5)
        
        hbox = gtk.HBox(False, 5)
        hbox.show()
        
        self.widInfoButton = gtk.Button("Anzeigen")
        self.widInfoButton.connect('clicked', self.actInfoButton)
        self.widInfoButton.show()
        hbox.pack_start(self.widInfoButton, False, False, 0)
        
        self.widEntriesCombo = gtk.combo_box_new_text()
        self.widEntriesCombo.show()
        hbox.add(self.widEntriesCombo)
        
        vbox.pack_start(hbox, False, False, 0)
        align.add(vbox)
        viewport.add(align)
        tab1.pack_start(viewport, True, True, 5)
        notebook.insert_page(tab1, None, 0)
        
    def actInfoButton(self, widget):
        self.widEntriesCombo.append_text("Ein sehr langer Text, der die ComboBox sehr weit ausdehnt")
        self.widEntriesCombo.set_active(0)
 
    def event_delete(self, widget, event, data=None):
        """ reagiert auf 'delete_event' """
        return False
 
    def destroy(self, data=None):
        """ reagiert auf 'destroy' """
        gtk.main_quit()
 
    def main(self):
        """ Nachrichtenschleife """
        gtk.main()
 
if __name__ == "__main__":
    app = probe()
    app.main()
http://www.decocode.de/
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

Ich habe das Skript noch mal reduziert. Es scheint an dem Viewport zu liegen, dessen Ausdehnung sich irgendwie nicht einstellen lässt. Merkwürdigerweise wird der Viewport (und damit auch das Fenster) korrekt ausgedehnt, wenn die ComboBox von Anfang an einen Inhalt hat, aber nicht, wenn sie den Inhalt erst nach dem Start des Fensters zugewiesen bekommt. Irgendwie unbefriedigend, und ich kann mir auch nicht vorstellen, dass es keine Möglichkeit gibt, dieses Verhalten zu beeinflussen. Nur wie?

Code: Alles auswählen

#!/usr/bin/python
#-*- coding: utf-8 -*-
 
import gtk
 
class probe(object):
    def __init__(self):
        """ Initialisiert das Fenster """
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_border_width(5)
        self.window.set_default_size(350, 50)
        self.window.connect('delete_event', self.event_delete)
        self.window.connect('destroy', self.destroy)
        self.window.show()
        
        viewport = gtk.Viewport()
        viewport.show()
        hbox = gtk.HBox()
        hbox.show()
        
        self.widInfoButton = gtk.Button("Anzeigen")
        self.widInfoButton.connect('clicked', self.actInfoButton)
        self.widInfoButton.show()
        hbox.pack_start(self.widInfoButton, False, False, 0)
        
        self.widEntriesCombo = gtk.combo_box_new_text()
        self.widEntriesCombo.show()
        
        hbox.pack_start(self.widEntriesCombo, gtk.EXPAND, gtk.EXPAND, 0)
        viewport.add(hbox)  # kein attribut pack_start
        self.window.add(viewport)  # kein attribut pack_start
        
    def actInfoButton(self, widget):
        self.widEntriesCombo.append_text("Ein sehr langer Text, der die ComboBox sehr weit ausdehnt")
        self.widEntriesCombo.set_active(0)
 
    def event_delete(self, widget, event, data=None):
        """ reagiert auf 'delete_event' """
        return False
 
    def destroy(self, data=None):
        """ reagiert auf 'destroy' """
        gtk.main_quit()
 
    def main(self):
        """ Nachrichtenschleife """
        gtk.main()
 
if __name__ == "__main__":
    app = probe()
    app.main()
http://www.decocode.de/
Benutzeravatar
atarax
User
Beiträge: 44
Registriert: Samstag 14. Juni 2008, 22:49
Wohnort: Berlin
Kontaktdaten:

Ich hab mich mal ein bisschen zum Viewport schlau gemacht und denke, dass dieses Widget einfach gar nicht dazu bestimmt ist, ausgedehnt zu werden. Das Problem verschwindet auch, wenn ich den Viewport weglasse. Ich habe es auch nur verwendet, um eine Rahmenlinie um das Kindwidget zu bekommen. Weiß jemand vielleicht eine andere Möglichkeit für eine Rahmenlinie, so dass ich auf das ganze Viewport-Widget verzichten kann?
http://www.decocode.de/
Antworten