Κατά τη διάρκεια των μαθημάτων μας έχουμε εξετάσει διάφορα module, με τη βοήθεια των οποίων επεκτείνουμε τις δυνατότητες των προγραμμάτων μας, αλληλεπιδρούμε με το Internet, χειριζόμαστε προγράμματα του υπολογιστή, κοκ. Ο καλύτερος τρόπος, όμως, να αυτοματοποιήσουμε μια εργασία, είναι να γράψουμε προγράμματα που ελέγχουν απευθείας τις συσκευές εισόδου. Πάμε να δούμε πώς, στο σημερινό μάθημα.
Προτάσεις συνεργασίας
Τα νέα άρθρα του PCsteps
Γίνε VIP μέλος στο PCSteps
Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.
Αυτοματισμός GUI
Με τέτοια προγράμματα χειριζόμαστε άμεσα το ποντίκι και το πληκτρολόγιο. Τεχνικές σαν αυτές που θα δούμε σήμερα ονομάζονται αυτοματισμοί γραφικής διεπαφής χρήστη (GUI, graphical user interface).
Οι αυτοματισμοί GUI μιμούνται την ανθρώπινη επικοινωνία με τον υπολογιστή, επιτρέποντας την υλοποίηση εικονικών κλικ και πληκτρολογήσεων.
PyAutoGui
Το module PyAutoGui έχει συναρτήσεις οι οποίες εξυπηρετούν αυτόν ακριβώς τον σκοπό: προσομοίωση της κίνησης του ποντικιού στην οθόνη, κλικ, κυλίσεων, πιέσεων πλήκτρων κλπ.
Δεν μπορούμε να δούμε, όμως, παρά ένα μέρος αυτών στο σημερινό μάθημα. Για αναλυτικότερες πληροφορίες, θα ανατρέξουμε στο πλήρες documentation.
Το module εγκαθίσταται με την κλασική μέθοδο που γνωρίζουμε από την εγκατάσταση άλλων module, τρέχοντας από την γραμμή εντολών των Windows την εντολή:
pip install pyautogui
Στη συνέχεια, δοκιμάζουμε αν ολοκληρώθηκε σωστά η εγκατάσταση, γράφοντας στον IDLE:
>>>import pyautogui
Μέτρα προστασίας
Πριν αρχίσουμε να γράφουμε κώδικα με αυτοματισμούς GUI, θα πρέπει να λάβουμε υπόψη μας τις δυσκολίες που κρύβουν τυχόν λάθη στον κώδικα.
Η Python μπορεί να κινήσει τον κέρσορα ή να πληκτρολογήσει σε τεράστιες ταχύτητες. Αν κάτι πάει στραβά, αλλά το πρόγραμμά μας συνεχίσει να κινεί το ποντίκι δεξιά-αριστερά, μπορεί η διακοπή του να αποβεί αδύνατη.
Ευτυχώς, υπάρχουν αρκετά εργαλεία για να αποτρέψουμε ή να επαναφέρουμε το σύστημά μας από τέτοια προβλήματα.
Αποσύνδεση
Ίσως ο πιο προφανής τρόπος να σταματήσουμε ένα πρόγραμμα είναι να κάνουμε αποσύνδεση από τα Windows, κάτι που θα τερματίσει όλα τα ανοιχτά προγράμματα.
Πατώντας Ctrl-Alt-Del, θα μας δοθεί η δυνατότητα για log out. Πρόκειται για μια σχετικά απλή λύση, με την οποία όμως χάνουμε οποιαδήποτε μη αποθηκευμένη εργασία.
Διακοπές και δικλείδες ασφαλείας
Μπορούμε, ακόμη, να ορίσουμε στον κώδικά μας να περιμένει μετά από κάθε κλήση συνάρτησης, δίνοντάς μας ένα μικρό χρονικό περιθώριο να ανακτήσουμε τον έλεγχο ποντικιού και πληκτρολογίου αν έχει δημιουργηθεί πρόβλημα.
Για να γίνει αυτό, χρησιμοποιούμε την μεταβλητή pyautogui.PAUSE, δίνοντας της ως τιμή τον αριθμό των δευτερολέπτων που θέλουμε να διαρκέσει η παύση. Αν, για παράδειγμα, γράψουμε pyautogui.PAUSE = 1.5, κάθε συνάρτηση του PyAutoGui θα αναμένει ενάμιση δευτερόλεπτο μετά την εκτέλεσή της.
Το PyAutoGui έχει μια ακόμα δικλείδα ασφαλείας, μια συνάρτηση fail-safe που μπορούμε προαιρετικά να ενεργοποιήσουμε. Με την fail-safe ενεργοποιημένη, αν μετακινήσουμε τον κέρσορα στην άνω αριστερά γωνία της οθόνης, το PyAutoGui θα παράγει ένα FailSafeException, μια εξαίρεση που θα διακόψει την εκτέλεση του προγράμματος.
Ακολουθεί ένα παράδειγμα των παραπάνω, στον IDLE:
>>> import pyautogui >>> pyautogui.PAUSE = 1 >>> pyautogui.FAILSAFE = True
Συντεταγμένες οθόνης
Πριν μάθουμε πώς να κινούμε τον κέρσορα και να τον εντοπίζουμε στην οθόνη, θα πρέπει να εξετάσουμε πώς δουλεύει το PyAutoGui με τις συντεταγμένες.
Οι συναρτήσεις που αφορούν το ποντίκι χρησιμοποιούν συντεταγμένες στον άξονα των x και y. Το αρχικό σημείο (0,0), βρίσκεται στην πάνω αριστερά γωνία της οθόνης. Οι συντεταγμένες των x και y, αυξάνονται προς τα δεξιά και προς τα κάτω, αντίστοιχα, και είναι μόνο θετικές.
Η ανάλυση λέει πόσα pixel πλάτος και ύψος έχει μια οθόνη. Στη συγκεκριμένη οθόνη, για παράδειγμα, η ανάλυση έχει οριστεί στα 1920 x 1080.
Με τη συνάρτηση pyautogui.size() παίρνουμε μια πλειάδα δύο ακεραίων· έναν για το πλάτος της οθόνης και έναν για το ύψος, σε pixel. Γράφουμε στον IDLE:
Βλέπουμε ότι η ανάλυση της οθόνης για το παράδειγμά μας είναι στα 1152 x 864. Μπορούμε να αποθηκεύσουμε τις δύο τιμές στις μεταβλητές width και height, για δική μας διευκόλυνση.
Έλεγχος κινήσεων ποντικιού
Πάμε λοιπόν να μετακινήσουμε το ποντίκι. Η συνάρτηση:
pyautogui.moveTo()
…θα μεταφέρει άμεσα τον κέρσορα σε ένα προκαθορισμένο σημείο της οθόνης. Οι τιμές των συντεταγμένων x, y, αποτελούν τα πρώτα δύο ορίσματα της συνάρτησης.
Προαιρετικά, με έναν ακόμα αριθμό στη μεταβλητή duration, δηλώνουμε τη διάρκεια που θέλουμε να έχει η μετακίνηση αυτή σε δευτερόλεπτα. Αν δεν τον χρησιμοποιήσουμε, η default τιμή είναι 0 δευτερόλεπτα, που σημαίνει ακαριαία μετακίνηση.
Γράφουμε στο διαδραστικό κέλυφος:
Με το που τρέξουμε το πρόγραμμα, θα δούμε το ποντίκι να κινείται μεταξύ των τεσσάρων συντεταγμένων που δώσαμε, 10 συνολικά φορές. Αν δεν είχαμε ορίσει διάρκεια 0.25 δευτερολέπτων, θα βλέπαμε τον κέρσορα απλά να τηλεμεταφέρεται από σημείο σε σημείο.
Εναλλακτικά, έχουμε τη συνάρτηση…
pyautogui.moveRel()
…η οποία κινεί τον κέρσορα σε σημεία σχετικά της τρέχουσας θέσης.
Με το παράδειγμα που ακολουθεί θα εκτελέσουμε τις ίδιες, τετράγωνου μοτίβου, κινήσεις με πριν. Η μόνη διαφορά έγκειται στο ότι οι κινήσεις θα ξεκινήσουν από το σημείο, όπου τυγχάνει να βρίσκεται κατά την εκτέλεση του προγράμματος ο κέρσορας.
Όπου έχουμε αρνητικές τιμές, αυτές δηλώνουν κίνηση στην αντίθετη της φυσιολογικής φοράς, δηλαδή προς τα αριστερά ή προς τα πάνω.
Παρατηρούμε και στα δύο παραδείγματα, ότι αν επιχειρήσουμε να συνεχίσουμε με την χρήση του ποντικιού, αυτό θα ακολουθεί τις κινήσεις του χεριού μας, αλλά και εκείνες που έχουμε ορίσει με τον κώδικα, μέχρι να ολοκληρωθούν.
Λήψη τοποθεσίας ποντικιού
Μπορούμε εύκολα να εξακριβώσουμε τις συντεταγμένες της τρέχουσας θέσης του κέρσορα, με τη βοήθεια της:
pyautogui.position()
Αυτό που θα μας επιστρέψει η συνάρτηση, είναι μια πλειάδα με τις συντεταγμένες x, y, κατά τη χρονική στιγμή κλήσης της συνάρτησης. Για παράδειγμα:
Κλικ ποντικιού
Για να στείλουμε ένα εικονικό κλικ στο PC μας, θα καλέσουμε τη συνάρτηση:
pyautogui.click()
Από προεπιλογή, η click χρησιμοποιεί το αριστερό κουμπί του ποντικιού (αριστερό κλικ) και εκτελείται στο τρέχον σημείο που βρίσκεται ο κέρσορας. Περνώντας της συντεταγμένες x, y, μπορούμε να εκτελέσουμε το κλικ σε κάποιο άλλο σημείο της οθόνης.
Αν θέλουμε να ορίσουμε συγκεκριμένο κουμπί του ποντικιού, θα χρησιμοποιήσουμε το όρισμα button, που λαμβάνει τιμές ‘left', ‘middle' ή ‘right'. Για παράδειγμα:
>>> import pyautogui >>> pyautogui.click(10, 5)
Το κλικ αυτό θα λάβει χώρα πάνω αριστερά στην οθόνη, όπου έχει μετακινηθεί αυτόματα ο κέρσορας. Να σημειωθεί ότι ως πλήρες κλικ εννοούμε το πάτημα και την απελευθέρωση του κουμπιού του ποντικιού, χωρίς την μετακίνηση του κέρσορα.
Μπορούμε να χωρίσουμε τις δύο αυτές ενέργειες με τις συναρτήσεις:
pyautogui.mouseDown() pyautogui.mouseUp()
…οι οποίες παίρνουν τα ίδια ορίσματα με την click().
Για περαιτέρω διευκόλυνση, έχουμε τη συνάρτηση:
pyautogui.doubleClick()
…η οποία εκτελεί (το συχνά χρησιμοποιούμενο) διπλό αριστερό κλικ, ενώ οι…
pyautogui.rightClick()
pyautogui.middleClick()
Σύρσιμο ποντικιού
Με τον όρο σύρσιμο εννοούμε την μετακίνηση του κέρσορα ενόσω είναι πατημένο κάποιο από τα κουμπιά του ποντικιού. Για παράδειγμα, σύρσιμο κάνουμε όταν μετακινούμε αρχεία μεταξύ φακέλων, τραβώντας το εικονίδιό τους.
pyautogui.dragTo() pyautogui.dragRel()
…για την μετατόπιση του κέρσορα σε νέο σημείο ή σε σημείο σχετικό του τρέχοντος, αντίστοιχα. Τα ορίσματα είναι ίδια με των συναρτήσεων moveTo() και moveRel(): μετατόπιση στον άξονα των x, μετατόπιση στον άξονα των y, προαιρετική διάρκειά της.
Συνιστούμε την χρήση μιας εφαρμογής όπως η Ζωγραφική των Windows για την δοκιμή των συναρτήσεων αυτών, για να αποφύγουμε να σύρουμε κάποιο άκυρο αντικείμενο.
Αφού τοποθετήσουμε τον κέρσορα στον καμβά του Paint, έχοντας επιλέξει Μολύβι ή κάποιο είδος Βούρτσας (για να παρακολουθούμε και τις κινήσεις μας), τρέχουμε το παρακάτω πρόγραμμα:
Αρχικά, μας δίνονται 5 δευτερόλεπτα για να μετακινήσουμε τον κέρσορα μέσα στο παράθυρο της εφαρμογής.
Στη συνέχεια, θα γίνει ένα κλικ από το πρόγραμμα, για να έρθει σε πρώτο πλάνο (focus) η εφαρμογή της Ζωγραφικής. Έπειτα, θα αρχίσει να σχεδιάζει σύμφωνα με τα drags που έχουμε ορίσει.
Εφόσον η μεταβλητή distance ξεκινάει στα 200, και σταδιακά την μειώνουμε, οι εντολές θα εκτελούνται μέχρι να φτάσει στο 0 (οπότε και παύει να ισχύει η συνθήκη του while).
Παρατηρούμε πόσο ταχύτερα μπορούμε να σχεδιάσουμε με τον αυτοματισμό ένα σχήμα που απαιτεί ακρίβεια, σε σύγκριση με το χέρι.
Κύλιση ποντικιού
Η τελευταία συνάρτηση που θα δούμε για το ποντίκι είναι η scroll(). Περνώντας της ως όρισμα μονάδες (units) θα εκτελέσει scroll του ποντικιού, προς τα πάνω ή προς τα κάτω κατά το ποσό αυτό.
Το μέγεθος μιας μονάδας εξαρτάται από το λειτουργικό και από την εκάστοτε εφαρμογή, επομένως θα χρειαστεί να πειραματιστούμε για να αποφασίσουμε πόσα scroll χρειαζόμαστε. Θετικός αριθμός προκαλεί κύλιση προς τα πάνω και αρνητικός προς τα κάτω.
Μπορούμε να δοκιμάσουμε τη scroll(), ανοίγοντας ένα παράθυρο που να έχει περιθώρια κύλισης, πχ έναν οδηγό του PCsteps. Αφού κάνουμε scroll προς το κάτω μέρος της σελίδας, τρέχουμε στον IDLE τις εντολές:
>>> import time, pyautogui >>> time.sleep(5); pyautogui.scroll(2000)
Δίνουμε στον εαυτό μας περιθώριο 5 δευτερολέπτων να φέρουμε σε πρώτο πλάνο το παράθυρο του PCsteps. Έπειτα θα δούμε το περιεχόμενο να κυλάει προς τα πάνω.
Έχουμε βάλει τις δύο εντολές στην ίδια σειρά, χωρισμένες με το ελληνικό ερωτηματικό (;), για να τις τρέξουμε ταυτόχρονα, χωρίς να αλλάζει κάτι στην σύνταξή τους. Tο ίδιο ακριβώς θα ήταν αν τις γράφαμε τη μία κάτω από την άλλη, απλώς θα χάναμε χρόνο γράφοντας την δεύτερη εντολή μετά το sleep().
Στο επόμενο μάθημα για τον προγραμματισμό Python
Θα ολοκληρώσουμε την ενότητα με τους αυτοματισμούς GUI, γράφοντας ένα ενδεικτικό πρόγραμμα, αφού δούμε τις συναρτήσεις που αφορούν το πληκτρολόγιο.
Σας άρεσε το σημερινό μάθημα για τον προγραμματισμό Python
Οι αυτοματισμοί που μαθαίνουμε στο σημερινό και το επόμενο μάθημα είναι και η τελευταία ενότητα που θα δούμε στα πλαίσια των μαθημάτων μας. Ελπίζουμε να τους βρείτε όσο ενδιαφέροντες φάνηκαν και σε μας.
Για να δείτε όλα τα μαθήματα Python από την αρχή τους, αλλά και τα επόμενα, αρκεί να κάνετε κλικ εδώ.