Home » Εβδομαδιαίες Στήλες » Προγραμματισμός » Μαθήματα Προγραμματισμού Python Από Το PCsteps: #20

Μαθήματα Προγραμματισμού Python Από Το PCsteps: #20

Αυτός ο οδηγός γράφτηκε πριν από περισσότερα από 2 χρόνια. Η τεχνολογία αλλάζει και εξελίσσεται. Αν οτιδήποτε δεν σας λειτουργεί, γράψτε μας στα σχόλια και θα κοιτάξουμε να τον ανανεώσουμε.

Μετά τους αυτοματισμούς GUI για το ποντίκι, που είδαμε την περασμένη εβδομάδα, θα ρίξουμε σήμερα μια μάτια και στους αντίστοιχους για το πληκτρολόγιο. Θα γράψουμε, ακόμα, ένα πρόγραμμα που συμπληρώνει αυτόματα μια online φόρμα, μέσω εικονικών κλικ και πληκτρολογήσεων. Πριν κλείσουμε, θα δούμε εν συντομία πώς να δημιουργήσουμε ένα εκτελέσιμο αρχείο του προγράμματός μας.

Δείτε τις ενότητες του οδηγού

Προτάσεις συνεργασίας

Προωθήστε δυναμικά την επιχείρησή σας στο site του PCsteps και στο κανάλι μας στο YouTube.

Επικοινωνία

Γίνε VIP μέλος στο PCSteps

Τα μέλη υποστηρίζουν ενεργά το PCsteps για να συνεχίσει να λειτουργεί χωρίς διαφημίσεις για όλους.

Συμμετοχή

Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.

Έλεγχος πληκτρολογίου

Συνεχίζουμε με τις συναρτήσεις του module PyAutoGui, από τις οποίες στο τελευταίο μάθημα είδαμε όσες έχουν σχέση με το ποντίκι.

Το PyAutoGui έχει κάποιες συναρτήσεις και για την αποστολή εικονικών πληκτρολογήσεων. Αυτές θα μας βοηθήσουν να συμπληρώσουμε πεδία σε σελίδες και online φόρμες.

Αποστολή string με το πληκτρολόγιο

Η συνάρτηση:

 pyautogui.typewrite()

…προσομοιώνει το πάτημα πλήκτρων του πληκτρολογίου μας στον υπολογιστή. Το τι κάνουν αυτά τα πατήματα εξαρτάται από το παράθυρο και το πεδίο κειμένου που έχουμε σε πρώτο πλάνο. Συχνά θα χρειαστεί να εκτελέσουμε ένα εικονικό κλικ ποντικιού σε κάποιο πεδίο, πριν προχωρήσουμε με κάποια πληκτρολόγηση.

Ως πρώτο παράδειγμα, θα χρησιμοποιήσουμε την Python για να γράψουμε αυτόματα τη φράση “Hello world!” στο παράθυρο ενός απλού επεξεργαστή κειμένου.

Αρχικά ανοίγουμε σε ένα νέο παράθυρο τον editor μας, και το τοποθετούμε στο πάνω αριστερά άκρο της οθόνης. Έτσι, διασφαλίζουμε ότι το PyAutoGui θα κάνει κλικ στο σωστό σημείο για να το φέρει σε πρώτο πλάνο. Έπειτα περνάμε τις εξής εντολές στον IDLE:

>>> pyautogui.click(100, 100); pyautogui.typewrite('Hello world!')

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

H Python θα στείλει πρώτα ένα εικονικό κλικ στις συντεταγμένες (100, 100), για να κάνει focus στο παράθυρο του editor. Στη συνέχεια η typewrite() θα αποστείλει το string στο περιεχόμενο του παραθύρου.

Η typewrite() από προεπιλογή πληκτρολογεί ακαριαία το string. Μπορούμε, ωστόσο, να περάσουμε προαιρετικά ένα δεύτερο όρισμα στη συνάρτηση, που θα προσθέσει μια μικρή παύση ανάμεσα σε κάθε χαρακτήρα.

Για παράδειγμα, η εντολή:

pyautogui.typewrite('Hello world!', 0.25)

…θα αναμένει ένα τέταρτο του δευτερολέπτου μετά την εμφάνιση κάθε χαρακτήρα, μέχρι να ολοκληρωθεί το string.

Ονόματα πλήκτρων

Δεν είναι εύκολο να αναπαραστήσουμε όλα τα κλειδιά με μονούς χαρακτήρες κειμένου. Για παράδειγμα, πώς θα αναπαρασταθεί το Shift ή το δεξί βελάκι με έναν μόνο χαρακτήρα?

Το PyAutoGui επιλύει το πρόβλημα χρησιμοποιώντας μικρά string: το ‘esc' για το πλήκτρο Escape, το ‘enter' για το Enter κοκ. Έπειτα μπορούμε να περάσουμε μια λίστα από τέτοια string στην typewrite(), αντί για ένα μόνο όρισμα.

Για παράδειγμα, καλώντας την ακόλουθη συνάρτηση, θα πατήσουμε τα πλήκτρα a, b, το αριστερό βέλος δύο φορές, και στο τέλος τα (κεφαλαία) X και Y:

>>> pyautogui.typewrite(['a', 'b', 'left', 'left', 'X', 'Y'])

Επειδή πιέσαμε δυο φορές το αριστερό βέλος, έχουμε κινήσει τον κέρσορα δυο θέσεις αριστερά. Αυτό σημαίνει ότι το αποτέλεσμα είναι XYab.

Ο επόμενος πίνακας περιλαμβάνει μια λίστα με όλα τα string πληκτρολογίου της PyAutoGui που μπορούμε να περάσουμε στην typewrite() για να μιμηθούμε οποιονδήποτε συνδυασμό πλήκτρων.

Πάτημα και απελευθέρωση του πληκτρολογίου

Όπως οι συναρτήσεις mouseDown() και mouseUp(), έτσι και οι:

pyautogui.keyDown() 
pyautogui.keyUp()

…θα προσομοιώσουν την ενέργεια του πατήματος ενός κουμπιού του πληκτρολογίου και της απελευθέρωσής του, αντίστοιχα.

Δέχονται ως όρισμα ένα string πληκτρολογίου και, όπως και στους αυτοματισμούς για το ποντίκι, μπορούν να συνδυαστούν σε μία συνάρτηση, την:

 pyautogui.press()

Παραδείγματος χάριν, οι παρακάτω εντολές θα τυπώσουν έναν χαρακτήρα δολαρίου ($):

>>> pyautogui.keyDown('shift'); pyautogui.press('4'); pyautogui.keyUp('shift')

Αν θέλουμε να γράψουμε string σε ένα πεδίο κειμένου, η συνάρτηση typewrite() είναι καταλληλότερη. Για εφαρμογές, όμως, που απαιτούν έναν μόνο χαρακτήρα, μπορούμε να χρησιμοποιήσουμε την press().

Συντομεύσεις πληκτρολογίου

Προκειμένου να γλιτώσουμε χρόνο, αξιοποιούμε συχνά συντομεύσεις του πληκτρολογίου, με τις οποίες ξεκινάμε μια εφαρμογή, ανοίγουμε νέο παράθυρο κλπ. Μια από τις πιο συχνά χρησιμοποιούμενες είναι το Ctrl-C, για την αντιγραφή του επιλεγμένου αντικειμένου.

Βήμα-βήμα, αυτό που κάνουμε είναι να πιέσουμε και να κρατήσουμε πατημένο το Ctrl, κατόπιν να πατήσουμε το C, και έπειτα να απελευθερώσουμε και τα δύο. Με τις συναρτήσεις που έχουμε δει ως τώρα, θα πρέπει να κάνουμε το εξής στην Python:

pyautogui.keyDown('ctrl')
pyautogui.keyDown('c')
pyautogui.keyUp('c')
pyautogui.keyUp('ctrl')

Αυτή η αλληλουχία εντολών για μια τόσο συχνή εργασία αντικαθίσταται από μία, χάρις στη συνάρτηση:

pyautogui.hotkey()

…η οποία παίρνει πολλαπλά ορίσματα string πληκτρολογίου, τα πατάει με τη σειρά, και στη συνέχεια τα απελευθερώνει με την ανάποδη σειρά. Για το Ctrl-C, θα έχουμε:

pyautogui.hotkey('ctrl', 'c')

Η συνάρτηση αποδεικνύεται ακόμα πιο χρήσιμη για μεγαλύτερους συνδυασμούς. Στις περισσότερες εκδόσεις του Word της Microsoft για παράδειγμα, η συντόμευση Ctl-Alt-Shift-S, εμφανίζει το παράθυρο “Στυλ”.

Αντί να κάνουμε οκτώ διαφορετικές κλήσεις συνάρτησης (τέσσερα keyDown() και τέσσερα keyUp()), αρκεί η κλήση του hotkey(‘ctrl, ‘alt', ‘shift', ‘s').

Ενδεικτικό πρόγραμμα

Η συμπλήρωση φόρμας είναι μια αρκετά βαρετή εργασία. Μπορεί, πχ, να έχουμε ένα φύλλο Excel, γεμάτο με δεδομένα, βάσει του οποίου συμπληρώνουμε επαναλαμβανόμενα την ίδια φόρμα.

Το να περνάμε ένα-ένα τα στοιχεία θα μας πάρει πολύ χρόνο. Η δουλειά αυτή μπορεί να γίνει αυτόματα με την Python. Ας πάρουμε το παράδειγμα μιας τέτοιας φόρμας:

Θα βρείτε τη φόρμα αυτή για να δοκιμάσετε τον κώδικα εδώ.

Τι θα πρέπει να κάνει το πρόγραμμά μας? Εύκολα μπορούμε να αντιληφθούμε τα ακόλουθα:

  • Κάνει κλικ στο πρώτο πεδίο που έχει η φόρμα.
  • Προχωράει συμπληρώνοντας τα πεδία, μέχρι το τελευταίο.
  • Κάνει κλικ στο κουμπί της Υποβολής.
  • Επαναλαμβάνει τη διαδικασία για το επόμενο σύνολο δεδομένων (αν υπάρχει)

Πάμε να δούμε αναλυτικά πώς θα γίνουν τα παραπάνω.

1ο Βήμα: Καθορισμός εργασιών

Πριν ξεκινήσουμε με τον κώδικα, πρέπει να σκεφτούμε ποιες ενέργειες ακριβώς, από πλευράς κλικ και πιέσεων πλήκτρων, χρειάζονται για τη συμπλήρωση της φόρμας. Ας τις δούμε βήμα-βήμα, με ενδεικτικό browser τον Chrome:

  1. Αρχικά, θα πρέπει να βρούμε τις συντεταγμένες στις οποίες θα γίνει το πρώτο κλικ, στο πρώτο πεδίο της φόρμας, δηλαδή το Όνομα. Πληκτρολογούμε ένα string.
  2. Συνεχίζουμε με Tab, στο επόμενο πεδίο, το έτος γέννησης. Περνάμε ένα string και ξαναπατάμε Tab.
  3. Με το πλήκτρο του κάτω βέλους, επιλέγουμε απάντηση για τη φυλή του Warcraft III. Ένα πάτημα μας δίνει Human, δύο πατήματα Orc, τρία Night Elf, τέσσερα Undead.
  4. Μετά την επιλογή, πατάμε Enter, και Tab για να πάμε στο επόμενο πεδίο.
  5. Πατάμε το δεξί βέλος για να επιλέξουμε απάντηση στην ερώτηση για τον πρωθυπουργό μας. Μια φορά για την επιλογή 2, δυο φορές για την επιλογή 3, τρεις για την 4 και τέσσερις για την 5. Για την επιλογή 1, στη οποία πάει εξαρχής ο κέρσορας, αρκεί να πατήσουμε Space.
  6. Με ένα τελευταίο Tab, μεταφερόμαστε στο πεδίο της Υποβολής, και πατάμε Enter.
  7. Αφού υποβληθεί η φόρμα, ο browser μας μεταφέρει σε άλλη μερίδα, όπου πρέπει να κάνουμε κλικ σε κάποιο link αν θέλουμε να επιστρέψουμε στη φόρμα.

Να σημειωθεί ότι θα πάρουμε τις αρχικές συντεταγμένες για τον κέρσορα, φροντίζοντας πρώτα να μεγιστοποιήσουμε το παράθυρο του browser. Έτσι αποφεύγουμε την πιθανότητα ο browser να βρεθεί σε άλλη θέση της οθόνης.

2ο Βήμα: Ρύθμιση συντεταγμένων

Ανοίγουμε τη φόρμα PCsteps και μεγιστοποιούμε το παράθυρο του browser. Στη συνέχεια, για να βρούμε τις συντεταγμένες του πεδίου, πρέπει να αρχίσουμε να κάνουμε δοκιμές. Εξετάζουμε μια εικονική, απόλυτη μετακίνηση του κέρσορα στην οθόνη, και βλέπουμε αν βρέθηκε πάνω στο πρώτο πεδίο της φόρμας.

Εναλλακτικά, μια λιγότερο “μπακάλικη” μέθοδος είναι να τρέξουμε ένα script που μας επιστρέφει τις συντεταγμένες του κέρσορα. Ένα τέτοιο πρόγραμμα είναι το παρακάτω:

Αυτό που κάνει είναι να τυπώνει συνεχώς (με έναν ατέρμονα βρόχο) την εκάστοτε τρέχουσα θέση του κέρσορα. Με την rjust() κάνουμε δεξιά στοίχιση στο string που θα τυπωθεί, ώστε να έχει το ίδιο μήκος ανεξαρτήτως ψηφίων. Για να σταματήσει η εκτέλεση του προγράμματος, θα πρέπει να πατήσουμε Ctrl-C.

Επίσης, στιγμιαία σβήνουμε την κάθε θέση και ξανά αρχίζουμε τον βρόχο από την αρχή, για να τυπώσουμε την νέα θέση, κοκ. Το σβήσιμο της θέσης που κάθε φορά τυπώνεται, γίνεται με backspace (\b) και αφαιρώντας τις newline με την προσθήκη του end=”. Για τεχνικούς λόγους που δεν θα μας απασχολήσουν, πρέπει να περάσουμε και ένα flush=True στο τέλος του print().

Τρέχοντας, λοιπόν, το πρόγραμμα από τη γραμμή εντολών, μετακινούμε τον κέρσορα στο πρώτο πεδίο της φόρμας και καταγράφουμε τις συντεταγμένες. Έπειτα συμπληρώνουμε πρόχειρα τη φόρμα (δεν μας απασχολεί τι δεδομένα εισάγουμε) για να μεταφερθούμε στη νέα σελίδα, με την “Υποβολή νέας απάντησης”.

Αφού μετακινήσουμε το ποντίκι στο link, σημειώνουμε και αυτές τις συντεταγμένες. Έχουμε, λοιπόν, μέχρι στιγμής τα εξής:

3ο Βήμα: Δεδομένα προς συμπλήρωση

Στον πραγματικό κόσμο, τα δεδομένα που περνάμε σε μια φόρμα μπορεί να προέρχονται από φύλλο Excel, αρχείο κειμένου ή ιστοσελίδα. Θα χρειαστεί πρόσθετος κώδικας για να τα φορτώσουμε στο πρόγραμμα.

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

Η formData περιέχει μια λίστα. Αυτή με τη σειρά της έχει τέσσερα λεξικά, με συνδυασμούς ονομάτων, ετών γέννησης και επιλογών για τα πεδία της φόρμας.

Στο σημείο αυτό μπορούμε να θέσουμε και τη μεταβλητή PAUSE στο 0.5, ώστε να υπάρχει μια καθυστέρηση μισού δευτερολέπτου μετά την κάθε κλήση συνάρτησης PyAutoGui.

4o Βήμα: Συμπλήρωση πεδίων

Γράφουμε τα ακόλουθα:

Με έναν βρόχο for θα περνάμε από κάθε λεξικό της formData, επιλέγοντας τιμές για να δώσουμε στις συναρτήσεις της PyAutoGui.

Δίνουμε την ευκαιρία στον χρήστη να πατήσει Ctrl-C για να κλείσει το πρόγραμμα, αν κάτι δεν πάει καλά. Παράλληλα, το πρόγραμμα αναμένει κάποια δευτερόλεπτα, ώστε να διασφαλίσει ότι η σελίδα έχει φορτωθεί στον browser.

Αμέσως μετά, προσθέτουμε το εξής κομμάτι κώδικα:

Εφόσον ο broswer έχει φορτώσει τη φόρμα, ήρθε η ώρα να καλέσουμε την click() για να κάνουμε κλικ στο πεδίο Όνομα. Στη συνέχεια, με την typewrite() περνάμε τα εκάστοτε string. Προσθέτουμε στις εκτυπώσεις και τον ειδικό χαρακτήρα ‘\t', για να προκαλέσουμε ένα εικονικό Tab.

5ο Βήμα: Συμπλήρωση πτυσσόμενου μενού και πολλαπλών επιλογών

Τα επόμενα πεδία της φόρμας είναι λίγο πιο περίπλοκα. Όπως είδαμε και κατά τον σχεδιασμό του προγράμματος, είναι προτιμότερο να χρησιμοποιήσουμε τα πλήκτρα κατεύθυνσης, παρά να επιλέξουμε με το ποντίκι. Διαφορετικά θα έπρεπε να καταγράψουμε τις συντεταγμένες για κάθε μία επιλογή.

Προσθέτουμε λοιπόν:

Με το που κάνουμε focus στη λίστα, πατάμε το κουμπί του κάτω βέλους για να κινηθούμε στη λίστα.

Αναλόγως της τιμής στο person[‘source'], το πρόγραμμα θα στείλει κάποιον αριθμό πιέσεων του πλήκτρου πριν να κάνει  Enter, και Tab στο επόμενο πεδίο. Αν η τιμή, για το συγκεκριμένο όνομα είναι πχ το ‘Orc', θα έχουμε δύο πατήματα του πλήκτρου.

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

6ο Βήμα: Υποβολή φόρμας και αναμονή

Γράφουμε και το τελευταίο κομμάτι κώδικα:

Προσομοιώνοντας το Enter, μετά το τελευταίο Tab που έχει γίνει, πατάμε στην Υποβολή της φόρμας. Έπειτα, το πρόγραμμα δίνει κάποια δευτερόλεπτα μέχρι να φορτώσει τη νέα σελίδα.

Με το που φορτωθεί η νέα σελίδα, περιέχει ένα link “Υποβολής νέας απάντησης”, το οποίο θα κατευθύνει τον browser σε μια καινούργια, κενή φόρμα. Έχουμε φροντίσει στο 2ο Βήμα να αποθηκεύσουμε τις συντεταγμένες του συγκεκριμένου link, οπότε αυτές θα περάσουμε στην click() ως όρισμα.

Πέρα από τη συνεχή συμπλήρωση φορμών, μέχρι να τελειώσουν τα δεδομένα μας, θα δούμε και την εκτύπωση των μηνυμάτων μας στον IDLE:

Έξτρα: εκτελέσιμο αρχείο

Πριν ολοκληρώσουμε, ας δούμε έναν απλό τρόπο να κατασκευάσουμε ένα εκτελέσιμο (.exe) αρχείο για το πρόγραμμά μας. Το εκτελέσιμο διαφέρει από το script μας κυρίως στο ότι μπορεί να εκτελεστεί ανεξάρτητα αν το σύστημα έχει την Python εγκατεστημένη.

Για να μπορέσουμε να φτιάξουμε αρχείο exe, χωρίς κόπο, θα χρειαστούμε κάποιο έτοιμο εργαλείο που να κάνει αυτή τη δουλειά για εμάς. Ένα από αυτά είναι το pyinstaller.

Pyinstaller

Το pyinstaller κατεβαίνει με τον γνωστό μας τρόπο, από την γραμμή εντολών, τρέχοντας την εντολή:

pip install pyinstaller

Κατεβάζοντάς το μέσω του pip, δεν πραγματοποιούμε πλήρη εγκατάσταση. Αυτό όμως δεν μας απαγορεύει να το χρησιμοποιήσουμε άμεσα· μπορούμε να δημιουργήσουμε το εκτελέσιμο του προγράμματός μας, αν βρίσκεται στον φάκελο εγκατάστασης της Python (όπου αποθηκεύεται έτσι κι αλλιώς από προεπιλογή).

Για να δούμε αν πέτυχε η εγκατάσταση, ελέγχουμε την έκδοση που βρίσκεται στο σύστημά μας:

C:\Users\PCsteps>pyinstaller --version 3.3.1

Δημιουργία εκτελέσιμου αρχείου

Πάμε να δημιουργήσουμε το exe μας. Αρχικά, επιλέγουμε ένα πρόγραμμά μας που είμαστε βέβαιοι ότι τρέχει χωρίς προβλήματα. Από την γραμμή εντολών, τρέχουμε την εντολή:

pyinstaller my_file.py

Όπου my_file.py θα βάλουμε το όνομα του αρχείου μας. Αν δεν έχουμε πλοηγηθεί μέσα από τη γραμμή εντολών στον φάκελο όπου είναι αποθηκευμένο, εκτός από το όνομα θα συμπεριλάβουμε και ολόκληρο το μονοπάτι του αρχείου.

Με την εκτέλεση της εντολής, δημιουργείται ένας φάκελος στην τοποθεσία του αρχείου, ο “dist”. Μέσα σε αυτόν περιέχεται ο φάκελος του εκτελέσιμου αρχείου.

Αυτόν τον φάκελο μπορούμε πλέον να μεταφέρουμε οπουδήποτε θέλουμε να τρέξουμε το πρόγραμμά μας. Για να το εκτελέσουμε, δεν έχουμε παρά να αναζητήσουμε ένα αρχείο .exe (Εφαρμογή), με το όνομα my_file, και να πατήσουμε διπλό κλικ.

Από το do/0cumentation του pyinstaller, θα βρούμε  διάφορα ορίσματα που μπορούμε να προσθέσουμε στην εντολή. Για παράδειγμα στην εντολή:

pyinstaller.exe --onefile --icon=image.ico my_file.py

Η –onefile, θα δημιουργήσει το αρχείο σε ένα μόνο πακεταρισμένο exe, ενώ η παράμετρος –icon=, μας επιτρέπει να επιλέξουμε το συγκεκριμένο αρχείο ως εικόνα για το exe μας.

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

Σας άρεσε το σημερινό μάθημα για τον προγραμματισμό Python;

Με το σημερινό μάθημα ολοκληρώνονται τα μαθήματα της Python. Σύντομα θα δημοσιεύσουμε poll, για να μάθουμε την άποψή σας σχετικά με την επόμενη γλώσσα που θα δούμε στη συνέχεια των μαθημάτων.

Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.
Τα σχόλια του PCsteps έχουν μεταφερθεί στο Questions.pcsteps.gr. Αν έχετε απορίες για τη δημοσίευση ή οποιαδήποτε τεχνολογική ερώτηση, από προτάσεις αγορών μέχρι τεχνικά προβλήματα, γράψτε μας εκεί. Απαντάμε το αργότερο εντός 48 ωρών.

Οι Στήλες του PCsteps

featured SALE ALERT 18 ΝΟΕΜΒΡΗ_x4Βb
Οδηγοί Αγοράς
QuickSteps#354 - Τείχος Προστασίας Windows 11, Παραποίηση Τοποθεσίας Chrome, Αύξηση Μεγέθους Εικόνων
QuickSteps
GamingSteps#20241123 - Final Fantasy XIV Mobile, Υποψηφιότητες The Game Awards ‘24, Νικητές Golden Joystick Awards
GamingSteps