2009-03-20 5 views
2

Ich muss Gtk2 für ein Projekt verwenden. Ich werde Python/Ruby dafür verwenden. Das Problem ist, dass das Packen irgendwie mystisch für mich ist. Ich versuchte, einen VBox mit, so dass ich die folgenden Widgets in meinem Fenster (in der folgenden Reihenfolge) haben könnte:Kann jemand Gtk2 Verpackung erklären?

  • menubar
  • Textansicht/Herausgeber Steuer

Ich

  • Symbolleiste Ich habe es geschafft, mit pack_start meinen Weg zu "raten" und das Layout zu bekommen, das ich brauche, aber ich würde es gerne verstehen. Die Dokumentation unter Ruby Gtk2 scheint viel zu unintuitiv (und so ist die Python, da es das gleiche ist, nur für Python geschrieben), könnten Sie etwas Licht?

    Auch funktioniert set_size_request nicht immer, wenn ich eine Komponente mit pack_start hinzufügen. Warum das ?

  • +0

    Für alle, die Probleme mit sprachspezifischen GTK + -Dokumenten haben, empfehle ich dringend, die primären C-Dokumente zu verwenden, die jede Funktion unter [developer.gnome.org] (https://developer.gnome.org) vollständig erklären. – oldtechaa

    Antwort

    14

    Box Verpackung ist wirklich einfach, so vielleicht Ihr Fehler zu verstehen ist, weil Sie sich vorstellen, es ist komplizierter als es ist.

    -Layout ist entweder vertikal (wie ein Stapel von Ziegeln) oder horizontal (wie eine Warteschlange von Menschen). Jedes Element in diesem Layout kann erweitert werden oder es kann nicht erweitert werden.

    Horizontal (HBox)

    [widget][widget][widget][widget] 
    

    Vertikal (VBox)

    [widget] 
    [widget] 
    [widget] 
    [widget] 
    

    So zum Beispiel, ein Horizontal-Layout (HBox) mit zwei Tasten, die der Code wäre:

    import gtk 
    box = gtk.HBox() 
    b1 = gtk.Button('button1') 
    b2 = gtk.Button('button2') 
    box.pack_start(b1) 
    box.pack_start(b2) 
    

    Jetzt, da der Standard für die Verpackung expand=True haben soll, fügen Sie beide diese Schaltflächen hinzu Ed auf die Box wird erweitert und sie werden jeweils die Hälfte der Fläche einnehmen. Egal wie groß der Container ist. Ich halte das für "dehnbar".

    Expanding-Widgets:

    [[ widget ][ widget ]] 
    

    Also, wenn Sie auf eine der Schaltflächen wollen nicht erweitern, werden Sie es wie folgt verpacken:

    box.pack_start(b1, expand=False) 
    

    nicht expandierenden widget:

    [[widget][  widget  ]] 
    

    Dann belegt die Schaltfläche nur den Platz, den sie zum Zeichnen benötigt: Text + Rahmen + Schatten + Bilder (falls vorhanden) e tc. Und die andere Schaltfläche wird erweitert, um die verbleibende Fläche zu füllen. Normalerweise müssen Schaltflächen nicht erweitert werden. Eine realistischere Situation ist also eine TextArea, die Sie erweitern möchten, um das Fenster zu füllen.

    Der andere Parameter, der an pack_start weitergegeben werden kann, ist der Füllungsparameter, und in der Regel kann dies ignoriert werden. Es ist hier genug zu sagen, dass wenn expand=False dann der Parameter vollständig ignoriert wird (weil es in dieser Situation keinen Sinn macht).Die andere Sache, die Sie erwähnt haben, ist set_size_request. Ich würde generell sagen, dass dies keine gute Idee ist. Ich sage allgemein, weil es Situationen gibt, in denen Sie es verwenden müssen. Aber für jemanden, der damit anfängt, eine GTK + Benutzeroberfläche zu packen, würde ich dringend empfehlen, sie nicht zu benutzen. Lassen Sie die Boxen und anderen Container im Allgemeinen Ihr Layout für Sie handhaben. Die set_size_request tut nicht genau das, was Sie erwarten würden. Es ändert nicht die Größe eines Widgets, sondern lediglich, wie viel Speicherplatz es benötigt. Es kann mehr verwenden und kann sich sogar ausdehnen, um größere Räume zu füllen. Es wird selten kleiner als die Anfrage, aber wieder, weil es nur eine "Anfrage" ist, gibt es keine Garantie, dass die Anfrage erfüllt wird.