Σύνθετα αντικείμενα στο Glade (α' μέρος)

sv1jsb | Πέμ, 06/09/2011 - 18:39 | 14' | 0
Σε αυτή την σειρά άρθρων θα δείξουμε ορισμένα νέα αντικείμενα του GTK και πως μπορούμε να τα δημιουργήσουμε και να τα παραμετροποιήσουμε μέσα από το Glade. Για όσους δεν έχουν εμπειρία με το Glade καλό είναι να ξεκινήσουν από την πρώτη σειρά άρθρων εδώ.
Θα φτιάξουμε το περιβάλλον χρήστη για ένα πρόγραμμα όπου θα μετατρέπει όλα τα αρχεία κειμένου που θα επιλέξει ο χρήστης σε κωδικοποίηση της αρεσκείας του. Θα μπορεί να μετατρέψει από και προς τα εξής συστήματα: utf-8, utf-16, windows-1253 και iso8859-7. Θα του δίνεται επίσης η δυνατότητα να αλλάξει το τέλος γραμμής των αρχείων μεταξύ των τριών που υπάρχουν σήμερα: \n,\r, \r\n.

 

Η δυνατότητα αυτή υπάρχει ενσωματωμένη τώρα πια σε όλους τους κειμενογράφους τόσο στα Linux και OSX όσο και στα Windows, αλλά το πρόγραμμα μας θα μπορεί να μετατρέψει πολλά αρχεία με διάφορες κωδικοποιήσεις με μια επιλογή μόνο (bulk ή αλλιώς “σωρηδόν”), και εκτός των άλλων χρησιμεύει για εκπαιδευτικούς σκοπούς τόσο στα Glade και GTK όσο και στην Python.

 

Ξεκινάμε λοιπόν με το Glade και δημιουργούμε το κύριο παράθυρο. Όνομα: convertwindow, τίτλος: Convert text files, αν θέλουμε Εικονίδιο δείνουμε το όνομα του (εμείς έχουμε το process.gif). Στο σήμα destroy του παραθύρου δίνουμε για handler close_window. Δώστε και 550 στην Αίτηση πλάτους. Στην συνέχεια προσθέτουμε ένα Vbox 3 γραμμών. Για την πρώτη γραμμή διαλέγουμε από τα Πλαίσια (containers) την “Γραμμή μενού” και για την τρίτη από τα Έλεγχος και Εμφάνιση την “Γραμμή κατάστασης”. Θα ζητήσει πόσα αντικείμενα θέλουμε στην γραμμή κατάστασης, διαλέγουμε ένα. Την ονομάζουμε statusbar και δίνουμε διάκενο 5.

 

 

Στο μενού έχει βάλει από μόνο του ορισμένες έτοιμες επιλογές για όλες τις χρήσεις. Θα το αλλάξουμε λίγο, δεν τις χρειαζόμαστε όλες. Με το menubar1 επιλεγμένο πατάμε στο κουμπί Edit της μπάρας εργαλείων. Αυτό ανοίγει ένα νέο παράθυρο όπου μπορούμε να προσθαφαιρέσουμε επιλογές στο μενού. Επιλέγουμε το tab Ιεραρχία για να δούμε την δομή του μενού. Κάνοντας δεξί κλικ σε όποια επιλογή θέλουμε μπορούμε να προσθέσουμε μία νέα, θυγατρική ή όχι. Αντίστοιχα με το κουμπί Αφαίρεση αφαιρούμε όποια θέλουμε. Μπορούμε ακόμα να τις μετακινήσουμε με το ποντίκι και να τους αλλάξουμε σειρά και επίπεδο. Διαλέγουμε την _Επεξεργασία και πατάμε Αφαίρεση, το ίδιο και για την Προβολή. Δεν χρειαζόμαστε επίσης τα imagemenuitem1 το οποίο έχει εικόνα του (gtk-new), το imagemenuitem4 (gtk-save-as). Προσθέτουμε ένα διαχωριστικό πάνω από το imagemenuitem10 και ένα νέο θυγατρικό στοιχείο εικόνας πάνω από το διαχωριστικό. Το ονομάζουμε helpmenu, διαλέγουμε σαν έτοιμο στοιχείο stock το “Βοήθεια” (gtk-help) και στο σήμα του activate δίνουμε handler: helpmenu_clicked. Το imagemenuitem10 το ονομάζουμε aboutmenu και στο activate βάζουμε aboutmenu_clicked. Με το ίδιο τρόπο έχουμε: imagemenuitem5 σε exitmenu και close_window (το ίδιο με του παραθύρου), imagemenuitem2 σε openmenu και openmenu_clicked, imagemenuitem3 σε savemenu και savemenu_clicked.
 

 

Τώρα το μενού έχει αυτή την διάταξη:

 

 

 

 

 

 

Την μεσαία θέση την χωρίζουμε σε δύο τμήματα με ένα Vbox. Στο πάνω τμήμα βάζουμε ένα scrollwindow και στην κάτω ένα frame. Αλλάζουμε και στα δύο το χαρακτηριστικό τους Σκίαση σε Μέσα. Σβήνουμε τα alignment1 και label1 από το frame. Αλλάζουμε τα Ανάπτυξη και Γέμισμα του frame στο Packing tab σε Όχι, δίνουμε 5 σαν τιμή στο αριθμητικό Γέμισμα.
Στην συνέχεια προσθέτουμε έναν Πίνακα τριών γραμμών και 2 στηλών στο frame.
Ο πίνακας έχει αντικαταστήσει το οριζόντιο box στις καινούργιες εκδόσεις του Glade και είναι αρκετά πιο χρηστικός από το να προσθέτουμε συνέχεια μία οριζόντια και μία κάθετα box.
Στη πρώτη στήλη του πίνακα βάζουμε τρία label. Και στα τρία αλλάζουμε την Στοίχιση Χ σε 0 (0 σημαίνει αριστερή στοίχιση, 0,50 είναι κέντρο και 1,00 δεξιά στοίχιση) στο Packing αλλάζουμε στις Οριζόντιες επιλογές το Επέκταση σε όχι (unchecked) και δίνουμε στο Οριζόντιο γέμισμα τιμή 5. Αλλάζουμε τις ετικέτες των label σε, από πάνω προς τα κάτω: Κωδικοποίηση από, Κωδικοποίηση σε, Τέλος γραμμής.

 

Στην δεύτερη στήλη προσθέτουμε τρία combobox. Δίνουμε και στα τρία την τιμή 5 για το Οριζόντιο γέμισμα. Ονομάζουμε το πρώτο codefrombox, το δεύτερο codetobox και το τρίτο eolbox. Για να μπορέσουμε να δώσουμε τιμές στα combobox πρέπει το καθένα να έχει ένα Μοντέλο. Διαλέγουμε από αριστερά από το τμήμα Μοντέλο δέντρου την Αποθήκη λιστών(listsource). Προσθέτουμε τρεις τέτοιες λίστες για τα τρία combo μας και τις ονομάζουμε αντίστοιχα codefromlist, codetolist, eollist. Στην κάθε λίστα πρέπει να ορίσουμε τι και πόσα δεδομένα θα εμφανίζει. Επειδή το ίδιο αντικείμενο χρησιμοποιείται και για την προβολή δέντρου (treeview) το οποίο εμφανίζει πολλές στήλες, μας δίνει την δυνατότητα να προσθέσουμε πολλές στήλες. Εμείς εδώ θέλουμε μόνο μία, να είναι gchararray (δηλαδή string) και θα δώσουμε όνομα σχετικό με την χρήση, όπως codefrom στο codefromlist, codeto στο codetolist και eol στο eolbox. Προχωρόντας πιο κάτω στο tab Γενικά συναντάμε την δυνατότητα να γεμίσουμε με τιμές τις λίστες. Εμείς εδώ θα τις γεμίσουμε μέσα από το πρόγραμμα. Τώρα, σε καθένα από τα combo επιλέγουμε στο tab Γενικά το αντίστοιχο Μοντέλο του.

 

Στην συνέχεια, πατώντας το κουμπί Edit στην γραμμή εργαλείων εμφανίζει ένα καινούργιο παράθυρο επεξεργασίας του τρέχοντος combo. Στο tab Ιεραρχία θα δώσουμε τα χαρακτηριστικά κάθε στήλης της λίστας. Το βασικότερο από όλα είναι το τι θέλουμε να εμφανίζει για αυτή την στήλη. Μπορεί κάθε στήλη της λίστας να εμφανίζει διαφορετικό αντικείμενο, άλλη να εμφανίζει text, άλλη γραφικό, άλλη combobox. Εμείς εδώ έχουμε combo και θέλουμε να μπορεί ο χρήστης να επιλέγει από τις διάφορες επιλογές. Αυτή η διαδικασία ονομάζεται spin για το GTK. Έτσι πατάμε Προσθήκη και αμέσως βάζει μια γραμμή cellrendertext1, και επιλέγουμε Spin στον Τύπο του Σχεδιαστή κελιών. Στην γραμμή Κείμενο επιλέγουμε το πεδίο που θέλουμε να εμφανίζεται, εδώ έχουμε μόνο ένα πεδίο, επιλέγουμε αυτό. Αυτή η διαδικασία επαναλαμβάνεται και για τα τρία combo που έχουμε.

 

Το παράθυρο μας έχει τώρα την εξής μορφή:

 

 

 

 

 

Το σώνουμε σαν convert.glade και πάμε να φτιάξουμε ένα προγραμματάκι σε python για να τεστάρουμε όσα έχουμε κάνει μέχρι τώρα.


import gtk
CODEPAGES = ['UTF-16','UTF-8','Windows-1253','ISO8859-7']
EOL = ['Windows','Unix','Mac']
class ConvertFiles(object):
    def close_window(self, widget, data=None):
        gtk.main_quit()
    def __init__(self):
        builder = gtk.Builder()
        builder.add_from_file("convert.glade")
        builder.connect_signals(self)
        self.window = builder.get_object("convertwindow")
        self.codefrombox = builder.get_object("codefrombox")
        self.codetobox = builder.get_object("codetobox")
        self.eolbox = builder.get_object("eolbox")
        self.codefromlist=builder.get_object("codefromlist")
        self.codetolist = builder.get_object("codetolist")
        self.eollist = builder.get_object("eollist")
        self.codefromlist.append([u"Μαντεψιά"])
        for item in CODEPAGES:
            self.codefromlist.append([item])
            self.codetolist.append([item])
        for item in EOL:
            self.eollist.append([item])
        self.codefrombox.set_active(0)
        self.codetobox.set_active(0)
        self.eolbox.set_active(0)
    def main(self):
        self.window.show()
        gtk.main()
if __name__== "__main__":
    app=ConvertFiles()
    app.main()

 

Φορτώνουμε το αρχείο Glade με τον builder και ορίζουμε τις δικές μας μεταβλητές για τα αντικείμενα μας. Μετά, με append σε κάθε λίστα την γεμίζουμε με τους πίνακες μας. Στην λίστα codefromlist βάζουμε μία παραπάνω επιλογή την “Μαντεψιά”. Το πρόγραμμα, όταν επιλέξουμε αρχεία προς μετατροπή, θα τα ανοίγει και θα προσπαθεί να βρει μόνο του σε τι κωδικοποίηση είναι. Αυτή η “μαντεψιά” δεν είναι πάντοτε σωστή, για λόγους που θα αναφέρουμε αργότερα, οπότε δίνουμε την δυνατότητα στον χρήστη να επιλέξει αυτός την κωδικοποίηση “από”.

 

Μετά το γέμισμα των λιστών κάνουμε ενεργό το πρώτο στοιχείο κάθε combo (πρώτο είναι το στοιχείο 0) για να μην είναι άδεια τελείως όταν ξεκινάει το πρόγραμμα. Θα παρατηρήσετε ότι στην append το στοιχείο προς πρόσθεση είναι μέσα σε αγκύλες [], αυτό γιατί η append του liststore περιμένει σαν όρισμα πίνακα ή tuple, αλλιώς βαράει λάθος κατά το τρέξιμο.

 

Αν όλα έχουν πάει καλά θα δείτε ένα τέτοιο παράθυρο να εμφανίζεται (αγνοήστε τα λάθη που εμφανίζει για τις μεθόδους που δεν έχουμε ορίσει ακόμα):

 

Το μενού μας είναι λειτουργικό, ανοίγουν δηλαδή τα υπομενού, βέβαια μόνο η επιλογή Έξοδος κάνει κάτι. Τα combo μας ανοίγουν και ο χρήστης επιλέγει. Κατά την αλλαγή του μεγέθους του παραθύρου πρέπει όλα να παραμένουν στο ίδιο ύψος, εκτός από τα combo που μεγαλώνουν μόνο κατά πλάτος και το μεσαία κενό μας το οποίο μεγαλώνει και στις δύο διαστάσεις.

 

Στο επόμενο άρθρο θα βάλουμε στο κενό ένα treeview όπου θα παρουσιάζονται τα αρχεία που έχει επιλέξει ο χρήστης, το όνομά τους, η κωδικοποίηση τους και το τέλος γραμμής τους.
Μπορείτε να κατεβάσετε αυτό το άρθρο (pdf), τις συλλήψεις οθόνης και τα αρχεία python και Glade από εδώ.
Δώσε αστέρια!

MO: (ψήφοι: 0)