Λύσεις των 3 Δραστηριοτήτων (κώδικας Tkinter), της επέκτασης της Εργαστηριακής άσκησης (πίτα matplotlib), των 3 Θεμάτων για συζήτηση και των 8 Ερωτήσεων του κεφαλαίου 9.
Ερώτηση: Τροποποιήστε κατάλληλα τον κώδικα του 1ου παραδείγματος για τη δημιουργία μηνυμάτων, ώστε να εμφανίσετε τα δικά σας μηνύματα με χρήση του Label.
Απάντηση:
Κρατάμε τη δομή του Παραδείγματος 1 (σελ. 160-161): δημιουργία παραθύρου με Tk(), ένα ή περισσότερα Label με το δικό μας κείμενο, pack() για κάθε στοιχείο, κουμπί εξόδου και mainloop(). Παράδειγμα με τρία μηνύματα, τίτλο παραθύρου και μορφοποίηση (γραμματοσειρά, χρώμα):
# -*- coding: utf-8 -*-
from Tkinter import *
window = Tk() # το αρχικό παράθυρο
window.title('Τα μηνύματά μου') # τίτλος στη μπάρα τίτλου
window.wm_geometry('300x150+50+50') # μέγεθος και θέση
a = Label(window, text='Καλημέρα Ελλάδα!', font=('Arial', 16, 'bold'), fg='blue')
a.pack()
b = Label(window, text='Καλώς ήρθατε στο μάθημα Προγραμματισμού Υπολογιστών')
b.pack()
c = Label(window, text='Γ΄ ΕΠΑ.Λ. - Τομέας Πληροφορικής', fg='red')
c.pack()
buttonA = Button(window, text='Έξοδος', command=window.destroy)
buttonA.pack()
window.mainloop() # εμφάνιση του παραθύρου
Τι αλλάξαμε: το κείμενο της παραμέτρου text (τα δικά μας μηνύματα), προσθέσαμε περισσότερα Label (καθένα με δικό του pack, εμφανίζονται το ένα κάτω από το άλλο), και προαιρετικά χρήση font/fg (χρώμα γραμμάτων) και title. Η πρώτη γραμμή # -*- coding: utf-8 -*- χρειάζεται στην Python 2 για ελληνικούς χαρακτήρες (όπως στο Παράδειγμα 2). Σε Python 3 το άρθρωμα λέγεται tkinter (πεζό).
Σύνοψη: Ίδια δομή με το Παράδειγμα 1: Tk() → Label(window, text='δικό μας μήνυμα') → pack() (όσα Label θέλουμε) → Button Quit → mainloop()· προαιρετικά font, fg, title, wm_geometry.
Κριτήρια αξιολόγησης:
Ερώτηση: Τροποποιήστε κατάλληλα το 2ο παράδειγμα, που παρουσιάστηκε παραπάνω, ώστε να δημιουργήσετε το δικό σας quiz γνώσεων.
Απάντηση:
Αλλάζουμε την ερώτηση, τη λίστα των επιλογών (πλειάδες κείμενο-τιμή) και τη σωστή τιμή στη συνάρτηση ελέγχου. Επιπλέον βελτίωση: το μήνυμα ανατροφοδότησης εμφανίζεται σε ένα Label που ενημερώνεται (με config) αντί να προστίθεται νέο Label σε κάθε κλικ, και κρατάμε σκορ:
# -*- coding: utf-8 -*-
from Tkinter import *
root = Tk()
root.title('Quiz Πληροφορικής')
c = IntVar()
c.set(0) # αρχικοποίηση επιλογής
score = [0] # σκορ (λίστα για να αλλάζει μέσα στη συνάρτηση)
answers = [
('Στοίβα', 1),
('Ουρά', 2),
('Λεξικό', 3),
('Πλειάδα', 4),
('Έξοδος', 5)
]
def ShowChoice():
# ενέργειες ανάλογα με την επιλογή του παίκτη
if c.get() == 5:
root.destroy()
elif c.get() == 2: # η σωστή απάντηση είναι η Ουρά (FIFO)
score[0] += 10
msg.config(text='Μπράβο!! Σωστά. Σκορ: ' + str(score[0]), fg='green')
else:
msg.config(text='Λάθος απάντηση, ξαναπροσπάθησε', fg='red')
Label(root, text='Ποια δομή δεδομένων λειτουργεί ως FIFO (First In First Out);',
justify=LEFT, padx=20).pack()
for txt, val in answers:
Radiobutton(root, text=txt, indicatoron=0, width=20, padx=20,
variable=c, command=ShowChoice, value=val).pack(anchor=W)
msg = Label(root, text='') # ετικέτα ανατροφοδότησης
msg.pack()
mainloop()
Τι αλλάξαμε σε σχέση με το βιβλίο: ερώτηση και επιλογές (θεωρία κεφ. 8), η σωστή τιμή στο elif c.get() == 2, η τιμή εξόδου (5), και η ανατροφοδότηση μέσω msg.config(...) (ενημέρωση υπάρχοντος Label) με σκορ. Τα Radiobutton μοιράζονται την ίδια μεταβλητή c (variable=c) ώστε μόνο ένα να είναι επιλεγμένο, και κάθε πάτημα καλεί τη ShowChoice (command). Μπορούμε να επεκτείνουμε με λίστα ερωτήσεων και κουμπί «Επόμενη».
Σύνοψη: Ίδια δομή με το Παράδειγμα 2: IntVar c, λίστα πλειάδων (κείμενο, τιμή), Radiobutton με variable=c/command=ShowChoice/value, συνάρτηση που ελέγχει c.get() για σωστό/λάθος/έξοδο· δικές μας ερωτήσεις, απαντήσεις και σωστή τιμή.
Κριτήρια αξιολόγησης:
Ερώτηση: Δοκιμάστε στο 4ο παράδειγμα, που παρουσιάστηκε παραπάνω, να εμπλουτίσετε κατάλληλα τη φόρμα εισαγωγής στοιχείων, ώστε να εισάγονται και στη συνέχεια να εμφανίζονται περισσότερες πληροφορίες για το μαθητή, όπως το τμήμα και η τάξη του, η ηλικία, το φύλο, ο Μ_Ο των βαθμών τριμήνου κ.ά.
Απάντηση:
Προσθέτουμε για κάθε νέα πληροφορία ένα ζεύγος Label + Entry σε νέα γραμμή του grid, και για το φύλο δύο Radiobutton με κοινή μεταβλητή StringVar. Η συνάρτηση εμφάνισης διαβάζει όλα τα πεδία με get(), τα τυπώνει και τα καθαρίζει με delete(0, END):
# -*- coding: utf-8 -*-
from Tkinter import *
def show_eisodo():
print 'First Name: %s\nLast Name: %s' % (fname.get(), lname.get())
print 'Class/Section: %s Age: %s Sex: %s' % (tmima.get(), age.get(), sex.get())
print 'Average grade: %s' % mo.get()
for e in (fname, lname, tmima, age, mo):
e.delete(0, END) # καθαρισμός των πεδίων
window = Tk()
window.title('Στοιχεία μαθητή')
labels = ['First Name', 'Last Name', 'Class - Section', 'Age', 'Average (term)']
for i in range(len(labels)):
Label(window, text=labels[i]).grid(row=i, sticky=W)
fname = Entry(window)
lname = Entry(window)
tmima = Entry(window)
age = Entry(window)
mo = Entry(window)
entries = (fname, lname, tmima, age, mo)
for i in range(len(entries)):
entries[i].grid(row=i, column=1)
sex = StringVar()
sex.set('Boy')
Label(window, text='Sex').grid(row=5, sticky=W)
Radiobutton(window, text='Boy', variable=sex, value='Boy').grid(row=5, column=1, sticky=W)
Radiobutton(window, text='Girl', variable=sex, value='Girl').grid(row=5, column=2, sticky=W)
Button(window, text='Quit', command=window.quit).grid(row=6, column=0, sticky=W, pady=4)
Button(window, text='Print', command=show_eisodo).grid(row=6, column=1, sticky=W, pady=4)
mainloop()
Εξήγηση: ο grid οργανώνει τα widgets σε γραμμές (row) και στήλες (column) — ετικέτες στη στήλη 0, πεδία στη στήλη 1· sticky=W στοιχίζει αριστερά. Οι τιμές των Entry είναι συμβολοσειρές — αν θέλουμε υπολογισμούς (π.χ. έλεγχος ότι ο Μ.Ο. είναι 0-20) μετατρέπουμε με float(mo.get()). Αντί για print στην κονσόλα, μπορούμε να εμφανίζουμε τα στοιχεία σε ένα Label μέσα στο παράθυρο (result.config(text=...)), όπως στη δραστηριότητα 2.
Σύνοψη: Επέκταση του Παραδείγματος 4: νέα ζεύγη Label+Entry (τμήμα/τάξη, ηλικία, Μ.Ο.) σε επόμενες γραμμές του grid, Radiobutton με StringVar για το φύλο, η show_eisodo διαβάζει όλα τα get() και καθαρίζει με delete(0, END).
Κριτήρια αξιολόγησης:
Ερώτηση: Επέκταση της άσκησης: τροποποιήστε το παράδειγμα οπτικοποίησης δεδομένων με πίτα, ώστε να απεικονιστούν, όπως στην εικόνα, τα δεδομένα του προβλήματος (έρευνα σε 200 μαθητές: 60 Λαϊκό, 40 Rock, 15 Metal, 30 Pop, 25 Hip hop, 30 άλλο) με αξιοποίηση της βιβλιοθήκης matplotlib και χρήση της pie() και με αυτόματη απεικόνιση των ποσοστών.
Απάντηση:
Δεδομένα: 200 μαθητές — Λαϊκό 60, Rock 40, Metal 15, Pop 30, Hip hop 25, Άλλο 30. Τα ποσοστά υπολογίζονται αυτόματα από τη pie() (παράμετρος autopct): Λαϊκό 30,0%, Rock 20,0%, Metal 7,5%, Pop 15,0%, Hip hop 12,5%, Άλλο 15,0% — ακριβώς όσα δείχνει η εικόνα του βιβλίου (σελ. 168).
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
labels = ['laiko', 'Rock', 'Metal', 'Pop', 'Hip hop', 'Other'] # είδη μουσικής
sizes = [60, 40, 15, 30, 25, 30] # πλήθος μαθητών
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90) # autopct: ποσοστά με 1 δεκαδικό
plt.axis('equal') # ίσοι άξονες -> κυκλική (όχι ελλειπτική) πίτα
plt.title('music preferences')
plt.show()
Εξήγηση: η pie(sizes, labels=…, autopct='%1.1f%%') παίρνει τις απόλυτες τιμές και υπολογίζει μόνη της τα ποσοστά (τιμή/άθροισμα), τα οποία εμφανίζει πάνω στα τμήματα με τη μορφή του autopct (ένα δεκαδικό και το σύμβολο %). Η axis('equal') κάνει την πίτα κυκλική, το startangle περιστρέφει την αρχή. Προαιρετικά: explode=(0, 0.1, 0, 0, 0, 0) για να «ξεχωρίσει» ένα τμήμα, shadow=True, colors=[…], ή plt.savefig('pie.png') για αποθήκευση σε αρχείο. Εγκατάσταση: σε Debian/Ubuntu sudo apt-get install python-matplotlib (το βιβλίο αναφέρει build-dep), ή pip install matplotlib. Το πρόγραμμα εκτελέστηκε και τα ποσοστά επαληθεύτηκαν.
Αξία της οπτικοποίησης (μέρος της συζήτησης): ένα γράφημα δείχνει με μια ματιά τη σχετική βαρύτητα κάθε κατηγορίας (το Λαϊκό είναι σχεδόν το 1/3, το Metal ελάχιστο), κάτι που από τον πίνακα αριθμών απαιτεί υπολογισμούς· η matplotlib δίνει με λίγες γραμμές πίτες, ραβδογράμματα, γραμμές, ιστογράμματα, διασπορές — έτοιμος κώδικας (API) που δεν χρειάζεται να ξαναγράψουμε.
Σύνοψη: labels/sizes με τα 6 είδη και τα πλήθη (60, 40, 15, 30, 25, 30)· plt.pie(sizes, labels=labels, autopct='%1.1f%%')· axis('equal'), title, show() — ποσοστά 30/20/7,5/15/12,5/15 %.
Κριτήρια αξιολόγησης:
Ερώτηση: Σε ένα έξυπνο τηλέφωνο πόσες κινήσεις χρειάζονται για να κάνουμε μία κλήση από το ευρετήριο; Σε σχέση με ένα «παραδοσιακό» κινητό τηλέφωνο είναι πιο σύνθετη ή πιο απλή διαδικασία; Τι θα προτείνατε για να βελτιώσετε τη διαδικασία αυτή;
Απάντηση:
Σύνοψη: (ενδεικτική) Smartphone ≈ 5-6 κινήσεις (ξεκλείδωμα, εφαρμογή, επαφές, αναζήτηση, επιλογή, κλήση) έναντι ≈ 3 στο παραδοσιακό (ευρετήριο, επιλογή, πράσινο πλήκτρο)· το παραδοσιακό απλούστερο σε βήματα, το smartphone ευέλικτο (αναζήτηση, shortcuts)· βελτιώσεις: αγαπημένα στην οθόνη κλειδώματος, φωνητική κλήση, πλήκτρο κλήσης δίπλα σε κάθε επαφή, απλή λειτουργία, ανατροφοδότηση.
Κριτήρια αξιολόγησης:
Ερώτηση: Ποια εικονίδια πιστεύετε ότι είναι τα πιο κατάλληλα να χρησιμοποιήσουμε σε μια εφαρμογή για να δηλώσουμε στο χρήστη ότι με αυτά μπορεί αντίστοιχα: να αλλάξει τη γλώσσα γραφής από το πληκτρολόγιο, να εκτυπώσει ένα κείμενο, να ζητήσει βοήθεια για τη χρήση του, να αναζητήσει ένα στοιχείο, να διαγράψει ένα στοιχείο;
Απάντηση:
Σύνοψη: (ενδεικτική) Γλώσσα: υδρόγειος ή ένδειξη EN/EL· εκτύπωση: εκτυπωτής· βοήθεια: ερωτηματικό (ή σωσίβιο)· αναζήτηση: μεγεθυντικός φακός· διαγραφή: κάδος απορριμμάτων ή Χ με επιβεβαίωση/αναίρεση — βάσει της αρχής της μεταφοράς και της συνέπειας.
Κριτήρια αξιολόγησης:
Ερώτηση: Στις υπηρεσίες τράπεζας εξυπηρέτησης πελατών, προστίθεται ως νέα υπηρεσία η δυνατότητα πληρωμής λογαριασμών τηλεφώνων μέσω των ΑΤΜ με αυτόματη χρέωση του λογαριασμού του ενδιαφερόμενου πελάτη. Λαμβάνοντας υπόψη τους βασικούς κανόνες του Shneiderman: Ποια είναι τα βασικά στοιχεία προσοχής των σχεδιαστών της εφαρμογής για τη νέα αυτή υπηρεσία, ώστε να μη γίνουν λάθη κατά τη διαδικασία πληρωμής; Πώς μπορούν να αποτραπούν λάθη κατά την είσοδο της ταυτότητας του λογαριασμού τηλεφώνου που θα πληρωθεί; Πώς ο πελάτης θα γνωρίζει ότι τελικά η διαδικασία πληρωμής ολοκληρώθηκε με επιτυχία;
Απάντηση:
Σύνοψη: (ενδεικτική) Συνέπεια με τις γνωστές λειτουργίες, λίγα βήματα, ελάχιστος φόρτος μνήμης (αποθηκευμένοι λογαριασμοί), πρόβλεψη σφαλμάτων και ακύρωση, έλεγχος από τον χρήστη· είσοδος κωδικού με ψηφίο ελέγχου, σάρωση barcode, επιλογή από λίστα και οθόνη επιβεβαίωσης με όνομα/αριθμό/ποσό· ολοκλήρωση με μήνυμα επιτυχίας, αριθμό αναφοράς, απόδειξη, νέο υπόλοιπο και σαφές μήνυμα σε αποτυχία.
Κριτήρια αξιολόγησης:
Ερώτηση: Τι είναι η επικοινωνία ανθρώπου υπολογιστή;
Απάντηση:
Σύνοψη: (ενδεικτική) Τομέας που ασχολείται με τον σχεδιασμό, την υλοποίηση και την αξιολόγηση διαδραστικών υπολογιστικών συστημάτων για ανθρώπινη χρήση και τη μελέτη των σχετικών φαινομένων (ACM)· στόχος η ευχρηστία.
Κριτήρια αξιολόγησης:
Ερώτηση: Τι είναι η διεπαφή χρήστη;
Απάντηση:
Σύνοψη: (ενδεικτική) Το επίπεδο (στοιχεία υλικού και λογισμικού άμεσης επαφής με τον άνθρωπο: οθόνη, πληκτρολόγιο, ποντίκι, παράθυρα, μενού, κουμπιά) μέσω του οποίου γίνεται η αλληλεπίδραση χρήστη-υπολογιστή· η ανάπτυξή της είναι μέρος της ΕΑΥ, με στόχο την ευχρηστία.
Κριτήρια αξιολόγησης:
Ερώτηση: Τι είναι η ευχρηστία συστήματος και ποια βασικά χαρακτηριστικά έχει ένα σύστημα με αυξημένη ευχρηστία;
Απάντηση:
Σύνοψη: (ενδεικτική) Ευχρηστία (ISO 9241) = αποτελεσματική και αποδοτική λειτουργία με υποκειμενική ικανοποίηση· χαρακτηριστικά: ευκολία εκμάθησης, υψηλή επίδοση, χαμηλή συχνότητα λαθών, ευκολία συγκράτησης της γνώσης χρήσης, ικανοποίηση χρήστη.
Κριτήρια αξιολόγησης:
Ερώτηση: Ποιοι είναι οι βασικοί κανόνες για το σχεδιασμό μιας διεπαφής;
Απάντηση:
Σύνοψη: (ενδεικτική) Σχεδίαση για όλους τους χρήστες + οι 8 κανόνες Shneiderman: συνέπεια, shortcuts, συνεχής ανατροφοδότηση, διάλογοι σε λίγα βήματα, πρόβλεψη σφαλμάτων, αναίρεση, έλεγχος από τον χρήστη, ελαχιστοποίηση φόρτου βραχύχρονης μνήμης (7±2).
Κριτήρια αξιολόγησης:
Ερώτηση: Τι είναι οι διεπαφές προγραμματισμού εφαρμογών – Application Programming Interfaces (APIs);
Απάντηση:
Σύνοψη: (ενδεικτική) Συλλογές έτοιμου κώδικα (βιβλιοθήκες λογισμικού, συνήθως ελεύθερο λογισμικό) που παρέχει η κοινότητα για την ανάπτυξη εφαρμογών· ορίζουν τι προσφέρει η βιβλιοθήκη κρύβοντας την υλοποίηση· καλή πρακτική η αξιοποίησή τους (Tkinter, matplotlib, sqlite3).
Κριτήρια αξιολόγησης:
Ερώτηση: Σε τι μας χρησιμεύει η βιβλιοθήκη Tkinter της Python;
Απάντηση:
Tk()), μέσα στα οποία τοποθετούμε γραφικά στοιχεία — widgets — που είναι αντικείμενα/στιγμιότυπα κλάσεων της βιβλιοθήκης: Label (μηνύματα ανατροφοδότησης), Button (κουμπιά που εκτελούν ενέργειες), Radiobutton (πολλαπλές επιλογές), Entry και Text (εισαγωγή/εμφάνιση κειμένου), εικόνες κ.ά., με διάταξη μέσω pack() ή grid() και τον βρόχο γεγονότων mainloop(). Παραδείγματα του βιβλίου: μήνυμα χαιρετισμού, quiz, ζάρι, φόρμα εισαγωγής στοιχείων.Σύνοψη: (ενδεικτική) Πρότυπη βιβλιοθήκη GUI της Python: παράθυρα και widgets (Label, Button, Radiobutton, Entry, Text) για φιλικές, αλληλεπιδραστικές διεπαφές — μηνύματα, κουμπιά, φόρμες εισόδου.
Κριτήρια αξιολόγησης:
Ερώτηση: Πώς μπορούμε να εμφανίσουμε ένα απλό μήνυμα ανατροφοδότησης προς το χρήστη με χρήση της Tkinter στην γλώσσα Python;
Απάντηση:
Tk() (πριν από κάθε άλλο στοιχείο), ③ δημιουργούμε ένα στιγμιότυπο της κλάσης Label με γονέα το παράθυρο και το κείμενο του μηνύματος, ④ το τοποθετούμε στο παράθυρο με pack(), ⑤ εμφανίζουμε το παράθυρο με mainloop():from Tkinter import * # εισαγωγή του module Tkinter
window_test = Tk() # δημιουργία του παραθύρου (δεν εμφανίζεται ακόμη)
a = Label(window_test, text='Hello Greece!') # ετικέτα με το μήνυμα, γονέας το παράθυρο
a.pack() # τοποθέτηση της ετικέτας στο παράθυρο
window_test.mainloop() # εμφάνιση του παραθύρου, αναμονή μέχρι να κλείσει
command του κουμπιού (όπως το «Μπράβο!!» στο quiz, σελ. 163) ή αλλάζουμε το κείμενο υπάρχοντος Label με a.config(text='...'). Εναλλακτικά, παράθυρο διαλόγου με tkMessageBox.showinfo('Τίτλος', 'Μήνυμα').Σύνοψη: Με Label: from Tkinter import * → window = Tk() → a = Label(window, text='μήνυμα') → a.pack() → window.mainloop()· για ανατροφοδότηση σε ενέργεια, Label μέσα στη συνάρτηση του command ή config(text=...).
Κριτήρια αξιολόγησης:
Ερώτηση: Σε τι μας χρησιμεύουν τα RadioButtons;
Απάντηση:
c = IntVar(), παράμετρος variable=c) και καθένα έχει τη δική του τιμή (value=val)· όταν ο χρήστης επιλέξει ένα, η μεταβλητή παίρνει την τιμή του και τη διαβάζουμε με c.get(). Με την παράμετρο command ορίζουμε συνάρτηση που εκτελείται σε κάθε επιλογή. Στο παράδειγμα του βιβλίου υλοποιούν quiz γνώσεων: κάθε πόλη είναι ένα Radiobutton (δημιουργούνται με βρόχο από λίστα πλειάδων), η ShowChoice() ελέγχει την τιμή και εμφανίζει μήνυμα σωστού/λάθους ή τερματίζει το πρόγραμμα. Γενικά: επιλογή φύλου, τάξης, μεγέθους, τρόπου πληρωμής — όπου οι επιλογές είναι αμοιβαία αποκλειόμενες.Σύνοψη: (ενδεικτική) Για την προσφορά πολλαπλών, αμοιβαία αποκλειόμενων επιλογών (μία κάθε φορά)· κοινή μεταβλητή variable, διαφορετικό value, ανάγνωση με get(), command για ενέργεια — π.χ. quiz γνώσεων.
Κριτήρια αξιολόγησης: