Open source repositories at: github and bitbucket. Current project: erp4all

Tuesday, June 21, 2011

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

Σε αυτό το άρθρο θα συνεχίσουμε την κατασκευή του κεντρικού παραθύρου για το πρόγραμμα μας και θα προσθέσουμε ορισμένα βοηθητικά για να δούμε την χρήση τους. Στο τρίτο μέρος θα παρουσιάσουμε το πρόγραμμα και την σύνδεση τον αντικειμένων του Glade με το πρόγραμμα μας.

Στο κεντρικό κενό του παραθύρου μας θέλουμε να προσθέσουμε μια Προβολή Δέντρου (TreeView). Το TreeView χρειάζεται ένα μοντέλο για να δείχνει τα δεδομένα του. Με τον ίδιο τρόπο που προσθέσαμε τα τρία ListStore στο προηγούμενο άρθρο για τα τρία combobox μας, πάμε να προσθέσουμε μια νέα Αποθήκη Λιστών (ListStore). Την ονομάζουμε filelist και προσθέτουμε τρεις στήλες τύπου gchararray με ονόματα: fname, codepage, eol. Μπορούμε τώρα να προσθέσουμε το TreeView και όταν μας ζητήσει πιο μοντέλο θέλουμε θα επιλέξουμε το filelist. Αφού προστεθεί κάτω από το scrollwindow, αλλάζουμε το όνομα του σε filelistview.


Μετά από αυτό πρέπει να ορίσουμε τι και πως θα εμφανίζει αυτό το TreeView. Πατάμε στο κουμπί Edit στην μπάρα εργαλείων, στο νέο παράθυρο που ανοίγει επιλέγουμε το tab Ιεραρχία. Εδώ θα ορίσουμε πως και τι θέλουμε να εμφανίσουμε από το μοντέλο μας. Πατάμε Προσθήκη και θα βάλει μια νέα στήλη. Αλλάζουμε τον Τίτλο σε Αρχείο και κάνουμε την Δυνατότητα αλλαγής μεγέθους Ναι.


Στην συνέχεια κάνουμε δεξί κλικ πάνω στην γραμμή και διαλέγουμε το Προσθήκη θυγατρικού Κειμένου αντικειμένου. Αυτό θα βάλει μια νέα γραμμή από κάτω με όνομα cellrendertext. Εδώ αλλάζουμε μόνο το Κείμενο και επιλέγουμε το fname από το μοντέλο μας. Ακριβώς τις ίδιες κινήσεις κάνουμε και για τις υπόλοιπες δύο στήλες που θέλουμε στο TreeView.
Τίτλος->Κωδικοποίηση, Δυνατότητα αλλαγής μεγέθους->Ναι, cellrendertext->Κείμενο->codepage.
Τίτλος->Τέλος γραμμής, Δυνατότητα αλλαγής μεγέθους->Ναι, cellrendertext->Κείμενο->eol.
Τώρα θα πρέπει να έχει την εξής μορφή η λίστα στην Ιεραρχία:



Το filelistview θα γεμίζει όταν ο χρήστης επιλέξει αρχεία προς μετατροπή. Θα πρέπει να προβλέψουμε τι δυνατότητα του χρήστη να αφαιρέσει ένα αρχείο από την λίστα. Θα μπορεί μαρκάροντας ένα αρχείο και πατώντας Delete να αφαιρείται το αρχείο από την λίστα. Χρειαζόμαστε οπότε μια μέθοδο που επιβλέπει αν πατήθηκε κουμπί. Στο tab Σήματα του filelistview στο GtkWidget και στο σήμα key-press-event δίνουμε σαν handler το filelistview-key. Σε αυτή θα αφαιρούμε την αντίστοιχη εγγραφή από το filelist. Θα έχει όμως το πρόγραμμα και έναν δικό του πίνακα με τα αρχεία, οπότε όταν αφαιρεθεί ένα από το filelist θα πρέπει να αφαιρέσουμε και από τον δικό μας. Για να γίνει αυτό χρειαζόμαστε να ελέγχουμε το σήμα row_deleted. Το επιλέγουμε έτσι από το tab Σήματα και δίνουμε σαν handler την μέθοδο filelist_row_deleted.

Το κεντρικό μας παράθυρο είναι τώρα έτοιμο. Έχει όλα τα σήματα και τα αντικείμενα που χρειαζόμαστε.



Για την επιλογή των αρχείων δημιουργούμε ένα filechooser, όπως στο προηγούμενο εκπαιδευτικό. Του δίνουμε όνομα filechooser, Τιτλος παραθύρου->Επιλέξτε αρχεία, Σχηματικό->Ναι, Καταστροφή με το μητρικό->Ναι, Επιλογή πολλαπλών->Ναι, Να επιτρέπεται η δημιουργία φακέλων->Οχι. Στο σήμα του delet-event δίνουμε σαν handler την delet_chooser (αναφερθήκαμε σ' αυτό στο προηγούμενο tutorial). Προσθέτουμε τα δύο κουμπιά, Ακύρωση και Εντάξει και τα αντίστοιχα σήματα τους στο clicked, filechooser_cancel και filechooser_ok.
Πάνω ακριβώς από τις θέσεις των κουμπιών υπάρχει μια κενή θέση. Εκεί θα δημιουργήσουμε ένα combobox με φίλτρα αρχείων για να επιλέξει ο χρήστης πια θέλει να του δείχνει προς επιλογή. Θα βάλουμε ένα Hbox 2 στοιχείων, αλλάζουμε τα Γεμισμα και Ανάπτυξη σε Όχι. Στην αριστερή θέση βάζουμε ένα label και κάνουμε την ετικέτα του “Φίλτρο επιλογής”. Αλλάζουμε και τα Γέμισμα και Ανάπτυξη σε Όχι. Πριν βάλουμε το combobox να φτιάξουμε μια νέα Αποθήκη λιστών (liststore) και να της δώσουμε όνομα filterlist. Βάζουμε μια στήλη gchararray, το όνομα δεν είναι σημαντικό, και προσθέτουμε τρεις επιλογές: Αρχεία txt (*txt), Αρχεία srt (*.srt), Όλα τα αρχεία (*.*). Τρεις επιλογές όπου μπορεί να είναι χρήσιμη η μετατροπή αρχείων. Μπορείτε εσείς να προσθαφαιρέσετε ανάλογα.
Προσθέτουμε τώρα το combobox στην δεξιά θέση, διαλέγουμε σαν μοντέλο του το filterlist, το ονομάζουμε filterbox και κάνουμε 0 (μηδέν) το Ενεργό αντικείμενο του. Στα Σήματα βάζουμε σαν handler στο changed την filterbox_changed. Στην συνέχεια πρέπει να ορίσουμε το spin του combobox, όπως και στα προηγούμενα. Πατάμε Edit στην γραμμή εργαλέιων, στο tab Ιεραρχία πατάμε Προσθήκη και αλλάζουμε σε spin των Τύπο, και τέλος διαλέγουμε για Κείμενο το πεδίο gchararray1 της στήλης μας. Θα χρειαστούμε βέβαια και τρία filefilter για να μπορέσουμε να δώσουμε τις αντίστοιχες τιμές. Βάλτε λοιπόν τρία με ονόματα txtfilter, srtfilter, allfilter.

Το filechooser έχει τώρα της εξής μορφή:












Ένα δεύτερο βοηθητικό παράθυρο που θα δημιουργήσουμε είναι το Περί... Βρίσκεται σε σχεδόν σε όλα τα προγράμματα σαν τελευταία επιλογή στο μενού Βοήθεια και εμφανίζει γενικές πληροφορίες για το πρόγραμμα και τους δημιουργούς του. Το GTK παρέχει ένα έτοιμο αντικείμενο για αυτό το σκοπό, το aboutdialog. Προσθέτουμε ένα λοιπόν ένα από τα Ανώτατα επίπεδα. Η ελληνική μετάφραση είναι Διάλογος πληροφοριών. Θα το ονομάσουμε aboutdialog. Στα πεδία που υπάρχουν στο tab Γενικά μπορούμε να συμπληρώσουμε ότι θέλουμε. Στο Όνομα προγράμματος δίνουμε Convert για να είμαστε συνεπής και από εκεί και πέρα μπορείτε να συμπληρώσετε όσα θέλετε για να δείτε πως επεκτείνετε μόνο του. Για παράδειγμα αν συμπληρώσετε Συγγραφείς θα προστεθεί αυτόματα ένα νέο κουμπί το Μνεία. Στο συγκεκριμένο έχουμε προσθέσει ένα γραφικό, σχόλια και συγγραφείς.

Για την Βοήθεια μπορούμε να δημιουργήσουμε ένα νέο παράθυρο με ένα textview αντικείμενο και να προβάλουμε πληροφορίες χρήσης του προγράμματος. Υπάρχει όμως ένα μειονέκτημα στο textview. Δεν μπορείς να διαμορφώσεις το κείμενο σου με συνδέσεις ή με έντονους ή πλάγιους χαρακτήρες. Θα έχει μια πολύ παλη μορφή χωρίς περιεχόμενα και αν η βοήθεια που χρειάζεται να γραφτεί είναι μεγάλη, θα είναι πολύ δύσχρηστο. Για αυτό προτείνουμε την δημιουργία ενός html αρχείου, όπου μπορούμε να το διαμορφώσουμε όπως θέλουμε, με ευρετήριο, ωραίο κείμενο και εικόνες, και προβολή του μέσω του εξ ορισμού browser του συστήματος. Στην python αυτό γίνεται πολύ εύκολα με τις παρακάτω γραμμές κώδικά:

import webbrowser
webbrowser.open(“help.html”)
Αυτές οι δυο γραμμές κώδικά θα ανοίξουν το αρχείο help.html στοn εξ ορισμού browser του συστήματος.

Όλα τα αντικείμενα μας είναι τώρα τα εξής:






















Μπορούμε με το παρακάτω πρόγραμμα να κάνουμε ένα έλεγχο για το πως εμφανίζονται όλα τα αντικείμενα μας πριν προχωρήσουμε στην δημιουργία του τελικού προγράμματος.
#!/usr/bin/env python
# -*- coding: utf-8 -*-

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 delete_chooser(self, widget, data=None):
        return True

    def aboutmenu_clicked(self, widget, data=None):
        self.aboutdialog.run()
        self.aboutdialog.hide()

    def helpmenu_clicked(self, widget, data=None):
        import webbrowser
        webbrowser.open("help.html")

    def openmenu_clicked(self, widget, data=None):
        self.filechooser.show()

    def filterbox_changed(self, widget, data=None):
        if widget.get_active() == 0:
            self.filechooser.set_filter(self.txtfilter)
        if widget.get_active() == 1:
            self.filechooser.set_filter(self.srtfilter)
        if widget.get_active() == 2:
           self.filechooser.set_filter(self.allfilter)

    def filechooser_cancel(self, widget, data=None):
        self.filechooser.hide()

    def filechooser_ok(self, widget, data=None):
        self.filechooser.hide()

    def savemenu_clicked(self, widget, data=None):
        pass

    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)
         self.filechooser = builder.get_object("filechooser")
         self.aboutdialog = builder.get_object("aboutdialog")
         self.txtfilter = builder.get_object("txtfilter")
         self.srtfilter = builder.get_object("srtfilter")
         self.allfilter = builder.get_object("allfilter")
         self.filterbox = builder.get_object("filterbox")
         self.txtfilter.add_pattern('*.txt')
         self.txtfilter.add_pattern('*.TXT')
         self.srtfilter.add_pattern('*.srt')
         self.srtfilter.add_pattern('*.SRT')
         self.allfilter.add_pattern('*.*')
         self.filterbox_changed(self.filterbox)
         self.statusbar=builder.get_object("statusbar")

    def main(self):
        self.window.show()
        gtk.main()

if __name__== "__main__":
    app=ConvertFiles()
    app.main()

Αυτό είναι σχεδόν ολοκληρωμένο το πρόγραμμα μας, δεν έχουν αναπτυχθεί μόνο οι openmenu_clicked και savemenu_clicked μέθοδοι. Λείπουν ακόμα οι filelistview_key και filelist_row_deleted. Αυτά θα τα δούμε στο επόμενο άρθρο. Μέχρι εδώ δεν έχει τίποτα καινούργιο εκτός από την filterbox_changed όπου ελέγχει πιο είναι το ενεργό αντικείμενο του combobox και αναλόγως επιλέγει το αντίστοιχο φίλτρο για το filechooser. Την καλούμε και από την __init__ αφού έχουμε γεμίσει τα φίλτρα μας για να ενεργοποιηθεί το φίλτρο στον filechooser.
H aboutmenu_clicked δείχνει το αντίστοιχο παράθυρο και η helpmenu_clicked ανοίγει τον browser με το αρχείο help.html.
Στο επόμενο άρθρο θα ασχοληθούμε με την περιγραφή και ολοκλήρωση του προγράμματος.
Τα αρχεία αυτού του άρθρου βρίσκονται σε μορφή .tar.gz εδώ.

No comments:

Post a Comment