Gtk.Entry - Gtk.CheckButton

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

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

Gtk.Entry - Gtk.CheckButton

Δημοσίευσηαπό clepto » 29 Ιουν 2013, 22:27

Σε αυτό το post θα δούμε πως μπορούμε να χρησιμοποιήσουμε την Gtk.Entry και το Gtk.CheckButton. Και τα δύο τα βλέπετε παντού και τα έχετε χρησιμοποιήσει πολλές φορές. Για να δούμε πως λειτουργούν λοιπόν. Ξανά αυτή τη φορά θα δώσω τον κώδικα πρώτα και θα εξηγήσω πιο μετά.

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

from gi.repository import Gtk, GObject

class MyWindow (Gtk.Window):
def __init__ (self):
Gtk.Window.__init__ (self, title="MyWindow")

self.set_size_request (200, 100)

self.entry = Gtk.Entry ()
self.entry.set_text ('Καλησπέρα!')

self.label = Gtk.Label ("")

self.editable = Gtk.CheckButton ("Επεξεργάσιμο")
self.editable.connect ('toggled', self.editable_toggled)
self.editable.set_active (True)

self.visible = Gtk.CheckButton ("Ορατό")
self.visible.connect ('toggled', self.visible_toggled)
self.visible.set_active (True)

self.pulse = Gtk.CheckButton ("Pulse")
self.pulse.connect ('toggled', self.pulse_toggled)
self.pulse.set_active (False)

self.text_button = Gtk.Button ("Εμφάνισε το κείμενο")
self.text_button.connect ('clicked', self.show_text)

self.delete_text_button = Gtk.Button ("Διέγραψε το κείμενο")
self.delete_text_button.connect ('clicked', self.delete_text)

hbox = Gtk.Box ()
hbox.pack_start (self.entry, True, True, 4)
hbox.pack_start (self.label, False, False, 4)

hbox2 = Gtk.Box ()
hbox2.pack_start (self.editable, False, False, 4)
hbox2.pack_start (self.visible, False, False, 4)
hbox2.pack_start (self.pulse, False, False, 4)
hbox2.pack_start (self.text_button, False, False, 4)
hbox2.pack_start (self.delete_text_button, False, False, 4)

vbox = Gtk.Box (orientation=Gtk.Orientation.VERTICAL)
vbox.pack_start (hbox, False, False, 4)
vbox.pack_start (hbox2, False, False, 4)

self.add (vbox)

def editable_toggled (self, button):
value = button.get_active ()
self.entry.set_editable (value)

def visible_toggled (self, button):
value = button.get_active ()
self.entry.set_visibility (value)

def pulse_toggled (self, button):
if button.get_active():
self.entry.set_progress_pulse_step(0.2)
# Call self.do_pulse every 100 ms
self.timeout_id = GObject.timeout_add(100, self.do_pulse, None)
else:
# Don't call self.do_pulse anymore
GObject.source_remove(self.timeout_id)
self.timeout_id = None
self.entry.set_progress_pulse_step(0)

def do_pulse(self, user_data):
self.entry.progress_pulse()
return True

def show_text (self, button):
text = self.entry.get_text ()
self.label.set_text (text)

def delete_text (self, button):
self.label.set_text ("")

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


Ο κώδικας αυτή τη φορά είναι λίγο μεγάλος γιατί προσπάθησα να συμπεριλάβω όσα περισσότερα μπορούσα, για να του ρίξουμε μια ματιά.

Καταρχάς δημιουργούμε μια κλάση όπως και στα προηγούμενα μαθήματα που είναι το παράθυρο μας. Στην συνέχεια δημιουργούμε μια Gtk.Entry και της προσθέτουμε το κείμενο "Καλησπέρα" ως εξής:
Μορφοποιημένος Κώδικας: Επιλογή όλων
self.entry = Gtk.Entry ()
self.entry.set_text ("Καλησπέρα")


Όπως έχετε καταλάβει η set_text χρησιμοποιείται όταν θέλουμε να προσθέσουμε κάποιο κείμενο στην Gtk.Entry.

Στην συνέχεια δημιουργούμε μια άδεια Gtk.Label που θα χρησιμοποιήσουμε αργότερα και φτάνουμε στο δεύτερο αντικείμενο που μας ενδιαφέρει, το Gtk.CheckButton. Για να δημιουργήσουμε ένα Gtk.CheckButton πρέπει να του περάσουμε ως όρισμα την ετικέτα που θα εμφανίζει, ακολουθεί ο κώδικας:

Μορφοποιημένος Κώδικας: Επιλογή όλων
self.editable = Gtk.CheckButton ("Επεξεργάσιμο")
self.editable.connect ('toggled', self.editable_toggled)
self.editable.set_active (True)

self.visible = Gtk.CheckButton ("Ορατό")
self.visible.connect ('toggled', self.visible_toggled)
self.visible.set_active (True)

self.pulse = Gtk.CheckButton ("Pulse")
self.pulse.connect ('toggled', self.pulse_toggled)
self.pulse.set_active (False)


Η συνάρτηση set_active του Gtk.CheckButton δέχεται τιμές boolean δηλαδή True/False ανάλογα την τιμή που θα του δώσουμε το Gtk.CheckButton γίνεται επιλεγμένο ή όχι. Ο υπόλοιπος κώδικας μέσα στην __init__ δημιουργεί δύο Gtk.Button και φτιάχνει το layout, μπορείτε να του ρίξετε μια ματιά άμα θέλετε.
Αυτό μου μένει να κάνω είναι να εξηγήσω σε τι χρησιμεύει κάθε συνάρτηση.

editable_toggled και visible_toggled

Οι δύο αυτές συναρτήσεις είναι ίδιες στην λογική, εκχωρούν στην μεταβλητή value True ή False ανάλογα με το αν το αντίστοιχο Gtk.CheckButton είναι τικαρισμένο ή όχι και περνάνε την value στην set_editable () και set_visiblity (). Η πρώτη ρυθμίζει το αν μπορούμε να επεξεργαστούμε την Gtk.Entry και η δεύτερη το αν θέλουμε να φαίνεται το κείμενο ή να όχι (σαν κωδικός δηλαδή). Μπορείτε να παίξετε λίγο με τα κουμπιά για να δείτε πως δουλεύει, ο κώδικας είναι αυτός:

Μορφοποιημένος Κώδικας: Επιλογή όλων
def editable_toggled (self, button):
value = button.get_active ()
self.entry.set_editable (value)

def visible_toggled (self, button):
value = button.get_active ()
self.entry.set_visibility (value)


pulse_toggled

Αυτή η συνάρτηση είναι διαφορετική από τις υπόλοιπες. Το pulse, όπως ονομάζεται, το χρησιμοποιούμε όταν θέλουμε να δείξουμε ότι γίνεται κάποια διεργασία στο παρασκήνιο και πρέπει να περιμένουμε. Ανάλογα με το αν το self.pulse είναι τικαρισμένο ή όχι θα πρέπει είτε να ενεργοποιούμε το pulse είτε να το απενεργοποιούμε. Για να το κάνουμε αυτό χρησιμοποιούμε τον έλεγχο που βλέπετε παρακάτω:

Μορφοποιημένος Κώδικας: Επιλογή όλων
def pulse_toggled (self, button):
if button.get_active():
self.entry.set_progress_pulse_step(0.2)
# Call self.do_pulse every 100 ms
self.timeout_id = GObject.timeout_add(100, self.do_pulse, None)
else:
# Don't call self.do_pulse anymore
GObject.source_remove(self.timeout_id)
self.timeout_id = None
self.entry.set_progress_pulse_step(0)

def do_pulse(self, user_data):
self.entry.progress_pulse()
return True


Όταν θέλεις να χρησιμοποιήσεις μια ProgressBar ή ένα Spinner στο γραφικό σου περιβάλλον για να δείξεις ότι γίνεται μια ενέργεια θα πρέπει αν όχι πάντα, σχεδόν πάντα, να χρησιμοποιήσεις το GObject.timeout_add αν είναι επαναλαμβανόμενη όπως το pulse ή το GObject.idle_add. Αν δεν το κάνεις τότε δεν θα δουλέψει η ProgressBar ή το Spinner.

Καταρχάς πρώτα θέτουμε το βήμα του pulse σε 0.2 και μετά καλούμε την GObject.timeout_add, η οποία κάθε 100 milliseconds (νομίζω) θα καλεί την self.do_pulse η οποία με την σειρά της θα μετακινεί το pulse κατά 0.2 όπως έχουμε ορίσει.

Από την άλλη, όταν θέλουμε να σταματήσουμε το pulse διαγράφουμε το self.timeout_id και θέτουμε το βήμα του pulse σε 0.

Ξέρω, ξέρω, το όλο θέμα είναι λίγο μπέρδεμα. Αφού και εγώ την πατάω μερικές φορές...

Τέλος, οι άλλες δύο συναρτήσεις εμφανίζουν το κείμενο της Gtk.Entry στην self.label που είχαμε δημιουργήσει και το διαγράφουν αντίστοιχα.

Στο επόμενο μάθημα θα δούμε για το Gtk.ComboBox και ότι άλλο μου έρθει στο κεφάλι :)
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