Containers - Gtk.Box, Gtk.Grid

...ασύγχρονα μαθήματα γλώσσας PyGtk

Συντονιστής: the_eye

Containers - Gtk.Box, Gtk.Grid

Δημοσίευσηαπό clepto » 24 Ιουν 2013, 15:44

Σε αυτό το μάθημα θα δούμε για τα Containers και πως μπορούμε να τοποθετήσουμε τα widgets μας όπως επιθυμούμε. Η Gtk σου δίνει την δυνατότητα να τοποθετήσεις τα widgets σε γραμμές, στήλες (Gtk.Box) και σε Gtk.Grid (τα Gtk.Tables δεν χρησιμοποιούνται πια) και το μέγεθος κάθε παραθύρου αλλά και container υπολογίζεται ανάλογα με το μέγεθος των widgets που αυτό περιέχει.


Gtk.Box

Ας αρχίσουμε με τα Gtk.Box. Όπως όλα τα containers ένα Gtk.Box είναι αόρατο για τον χρήστη αλλά μπορείτε να το φανταστείτε ως ένα οριζόντιο ή κάθετο κουτί που του προσθέτετε αντικείμενα.
Για να δημιουργήσουμε ένα Gtk.Box γράφουμε το εξής:

Μορφοποιημένος Κώδικας: Επιλογή όλων
box = Gtk.Box()


Από προεπιλογή το Gtk.Box που θα δημιουργηθεί θα είναι οριζόντιο, άμα θέλουμε να είναι κάθετο πρέπει να το περάσουμε ως όρισμα το

Μορφοποιημένος Κώδικας: Επιλογή όλων
box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)


Μπορούμε επίσης να περάσουμε ως όρισμα το homogeneous (True/False) δηλαδή αν θέλουμε όλα τα widgets που περιέχει το Gtk.Box να έχουν το ίδιο μέγεθος και το spacing (int) για το πόση απόσταση θα απέχουν μεταξύ τους.

Σε ένα Gtk.Box μπορούμε να προσθέσουμε με δύο τρόπους κάποιο widgets, από τα αριστερά προς τα δεξιά με το box.pack_start() και από τα δεξιά προς τα αριστερά με το box.pack_end().
Και τα δύο παίρνουν ακριβώς τις ίδιες παραμέτρους που είναι:

Μορφοποιημένος Κώδικας: Επιλογή όλων
pack_start(child, expand, fill, padding)


όπου child: το widgets που θέλουμε να προσθέσουμε
expand: αν θέλουμε να επεκταθεί στον διαθέσιμο χώρο (True/False)
fill: αν θέλουμε να καλύψει όλο το χώρο του container (True/False)
padding: πόσο θέλουμε να απέχει από άλλα widgets (προσθέτετε επιπλέον στο spacing)

Τώρα ας δούμε ένα παράδειγμα

Μορφοποιημένος Κώδικας: Επιλογή όλων
#!/usr/bin/python3

from gi.repository import Gtk

class MyWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="Hello World")

self.box = Gtk.Box(spacing=6)
self.add(self.box)

self.button1 = Gtk.Button(label="Hello")
self.button1.connect("clicked", self.on_button1_clicked)
self.box.pack_start(self.button1, True, True, 0)

self.button2 = Gtk.Button(label="Goodbye")
self.button2.connect("clicked", self.on_button2_clicked)
self.box.pack_start(self.button2, True, True, 0)

def on_button1_clicked(self, widget):
print "Hello"

def on_button2_clicked(self, widget):
print "Goodbye"

win = MyWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()


Gtk.Grid

Όπως και το Gtk.Box το Gtk.Grid είναι αόρατο για τον χρήστη αλλά μπορείτε να το φανταστείτε σαν πλέγμα. To Gtk.Grid μπορεί κάλλιστα να χρησιμοποιηθεί και ως Gtk.Box. Το Gtk.Grid δεν παίρνει καμία παράμετρο και μπορείτε να το δημιουργήσετε ως εξής:

Μορφοποιημένος Κώδικας: Επιλογή όλων
grid = Gtk.Grid()


Για να προσθέσετε κάποιο widget σε ένα Gtk.Grid μπορείτε να χρησιμοποιήσετε κάποια από τους παρακάτω τρεις τρόπους:
Μορφοποιημένος Κώδικας: Επιλογή όλων
grid.attach(child, left, top, width, height)
grid.attach_next_to(child, sibling, side, width, height)
grid.add(widget)


Η τελευταία προσθέτει το widget στην κατεύθυνση ανάλογα με το orientation που έχουμε ορίσει.
Η πρώτη προσθέτει το widget στην θέση που καθορίζεται από το κελί στα αριστερά του (left), πάνω του (top) αλλά και το μέγεθος του (width, height), ενώ η δεύτερη το προσθέτει στην θέση που καθορίζεται από το γειτονικό του widget (sibling) και την πλευρά με την οποία γειτονεύει (side) αλλά και το μέγεθος του ξανά. Η πλευρά μπορεί να πάρει τις εξής τιμές:

[*] Gtk.PositionType.LEFT
[*] Gtk.PositionType.RIGHT
[*] Gtk.PositionType.TOP
[*] Gtk.PositionType.BOTTOM

Για να καταλάβετε καλύτερα κοιτάξτε το παράδειγμα παρακάτω και αν δυσκολεύεστε ακόμα πείτε μου να ανεβάσω και άλλο.

Μορφοποιημένος Κώδικας: Επιλογή όλων
#!/usr/bin/python3

from gi.repository import Gtk

class GridWindow(Gtk.Window):

def __init__(self):
Gtk.Window.__init__(self, title="Grid Example")

grid = Gtk.Grid()
self.add(grid)

button1 = Gtk.Button(label="Button 1")
button2 = Gtk.Button(label="Button 2")
button3 = Gtk.Button(label="Button 3")
button4 = Gtk.Button(label="Button 4")
button5 = Gtk.Button(label="Button 5")
button6 = Gtk.Button(label="Button 6")

grid.add(button1)
grid.attach(button2, 1, 0, 2, 1)
grid.attach_next_to(button3, button1, Gtk.PositionType.BOTTOM, 1, 2)
grid.attach_next_to(button4, button3, Gtk.PositionType.RIGHT, 2, 1)
grid.attach(button5, 1, 2, 1, 1)
grid.attach_next_to(button6, button5, Gtk.PositionType.RIGHT, 1, 1)

win = GridWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Επιστροφή στο Μαθήματα PyGtk