Bab 5. Packing Widget

Daftar Isi

5.1. Packing Box
5.2. Packing Table

Untuk membuat aplikasi, Anda pasti ingin meletakkan banyak widget dalam sebuah window. Contoh program "halo indonesia" hanya menggunakan satu buah widget sehingga kita hanya membutuhkan method add() dari GtkContainer untuk packing widget tersebut ke dalam window. Namun jika kita ingin menempatkan lebih banyak widget ke dalam window, bagimana cara mengatur posisi masing-masing widget? Di sinilah kegunaan dari packing widget.

Namun mengapa kita menggunakan packing widget untuk mengatur letak dari widget. Bukankah kita bisa meletakkan sebuah widget langsung pada koordinat tertentu ? (Banyak yang telah terbiasa dengan pola drag control ke dalam form). Tentu saja hal ini juga dapat dilakukan. Namun untuk diingat bahwa Gtk tidak berasumsi dengan ukuran resolusi dari display Anda (misalnya 1024x768). Jika Anda mengubah ukuran window, semua widget di dalam window tersebut akan mengatur sendiri ukuran dan letaknya.

5.1. Packing Box

Umumnya packing dilakukan dengan membuat packing box. Packing box adalah widget yang tak-tampak. Kita dapat menggunakan dua jenis box yaitu box horisontal dan box vertikal. Sesuai dengan namanya box horisontal akan meletakkan widget yang dimasukkan ke dalam box dari kiri ke kanan atau dari kanan ke kiri tergantung pada method yang digunakan. Sedangkan untuk box vertikal akan mengatur widget dari atas ke bawah atau sebaliknya. Anda juga dapat menggunakan kombinasi beberapa box baik satu box di dalam yang lain atau saling berdampingan.

Untuk membuat box horisontal kita menggunakan gtk.HBox() dan untuk yang vertikal gtk.VBox(). Fungsi pack_start() dan pack_end() digunakan untuk memasukkan (packing) widget ke dalam box. pack_start() akan meletakkan widget dari atas ke bawah jika digunakan dalam VBox atau dari kanan ke kiri untuk HBox. Fungsi pack_end() akan berlaku sebaliknya. Fungsi-fungsi ini juga memudahkan pengaturan rata-kanan atau rata-kiri atau kombinasinya.

Box juga termasuk widget yang disebut sebagai container widget. Yaitu widget yang dapat memuat widget lain di dalamnya. Dengan box ini GTK akan mengatur secara otomatik misalnya dalam hal resizing. Juga ada beberapa pilihan lain yang dapat Anda gunakan untuk mengatur posisi widget di dalam box.

Karena fleksibel, packing box ini terlihat membingungkan pada mulanya. Terdapat banyak kombinasi argumennya. Namun secara singkat terdapat lima skema pengaturan. Untuk itu kita langsung lihat pada contoh program packbox.py . Jika kita jalankan maka akan terlihat window seperti berikut.

Gambar 5.1. PackBox 1

PackBox 1

Cobalah untuk mengubah ukuran windownya. Perhatikan perubahan widget-widget di dalamanya.

Jika kita lihat source-code, perhatikan di akhir program,

 if __name__ =="__main__":
     PackBox1(1)
     main()

Python mempunyai top-level script environment dengan nama __main__. Jika modul ini dijalankan langsung oleh python (bukan di-import oleh script lain) maka perintah di dalam "if" akan dijalankan.

Coba untuk mengganti argumen dari fungsi PackBox dari angka 1 misalnya dengan 2 atau 3. Kemudian jalankan kembali program, dan coba lagi untuk merubah ukuran windownya dan perhatikan perbedaanya.

Untuk membuat box, dapat menggunakan fungsi berikut :

    gtk.HBox(homogeneous=gtk.FALSE,spacing=0)
    gtk.VBox(homogeneous=gtk.FALSE,spacing=0)

Jika argumen homogeneous bernilai TRUE berarti widget-widget di dalam box akan berukuran sama, namun nilai defaultnya adalah FALSE. Sedangkan argumen spacing adalah ruang antara widget-widget di dalam box, dengan nilai default 0.

Fungsi yang perlu diperhatikan adalah fungsi pack_start() dan pack_end() .

    box.pack_start(child,expand=gtk.TRUE,fill=gtk.TRUE,padding=0)
    box.pack_end(child,expand=gtk.TRUE,fill=gtk.TRUE,padding=0)
boxobject packing box.
childwidget yang akan diletakkan ke dalam box.
expandargumen dengan tipe Boolean. Jika expand TRUE maka box akan mengisi semaksimal mungkin ruang yang ada di kiri-kanan HBox atau atas-bawah VBox. Jika expand FALSE maka box hanya akan seukuran dengan jumlah dari ukuran widget-widget di dalamnya.
fillargumen dengan tipe Boolean. Jika TRUE maka widget di dalam box akan menempati ruang dalam box semaksimal mungkin. Jika FALSE maka widget X di dalam box hanya akan seukuran dengan jumlah dari ukuran widget-widget di dalam widget X. Argumen fill hanya berpengaruh jika argumen expand bernilai TRUE.
paddingruang di kiri-kanan widget dalam HBox atau atas-bawah widget di dalam VBox.

Dengan parameter bernilai 2, PackBox1(2) window yang akan di tampilkan adalah :

Gambar 5.2. PackBox 2

PackBox 2

Perbedaan antara padding dan spacing adalah spacing membuat ruang diantara dua widget yang berdampingan sedangkan padding membuat ruang di sisi widget.

||widget1|..spacing..|widget2|..spacing..|widget3||

|padding..|widget1|..padding....padding..|widget2|..padding....padding..|widget3|..padding|

Sedangkan PackBox1(3) adalah contoh penggunaan method pack_end() sehingga window yang akan di tampilkan adalah :

Gambar 5.3. PackBox 3

PackBox 3