Python ile Klavye ve Fare Kontrolü (pyautogui)

İbrahim İrdem
7 min readAug 20, 2017

PyAutoGUI, fare ve klavyenizi kontrol etmenizi sağlayan, böylece otomatik görevler yapan botlar yazmanıza yardımcı bir Python kütüphanesidir.

Daha fazla bilgi için: https://pyautogui.readthedocs.io/en/latest/index.html

Bu kütüphaneyi dört ana parçada işleyeceğiz.

  1. Fare Kontrolü İşlevleri
  2. Klavye Kontrolü İşlevleri
  3. Mesaj Kutusu İşlevleri
  4. Ekran Görüntü İşlevleri

Yükleme

Windows kullanıcısı iseniz.

C:\Python34\pip.exe install pyautogui

Linux kullanıcısı iseniz.

pip3 install python3-xlibsudo apt-get install scrotsudo apt-get install python3-tksudo apt-get install python3-devpip3 install pyautogui

kurulumlarını yapmanız gerekmektedir.

Ayrıca pip ile PyAutoGUI kütüphanesini yüklerken Pillow kütüphanesi de yüklenecektir. Bunun nedeni Ekran görüntü işlevlerinde Pillow kütüphanesini kullanmaktadır.

1. Fare Kontrol İşlevleri

x, y koordinat sistemi

Fare kontrolü yapabilmemiz için ekrandaki koordinat sistemini anlayabilmemiz gerekir.

Bu koordinat sistemi x (yatay) ve y (dikey) düzlemlerden oluşmaktadır.

Sol üst (x,y) koordinatı (0,0) olarak başlangıç olup, x sağa doğru artış gösterirken y aşağı doğru artış gösterir.

Ekran boyut sınırları her bilgisayarda farklılık gösterebilir.

Bir örnekle kendi ekran boyutumuzu bulalım.

>>> import pyautogui
>>> pyautogui.size()
(1366, 768)

Fare imlecinin konumunu bulmak için ise position() fonksiyonunu kullanırız.

>>> pyautogui.position()
(350, 327)

Koordinatlarımızın (x, y) ekran sınırları içerisinde olup olmadığını anlamak için onScreen() fonksiyonundan faydalanırız. onScreen(x,y) fonksiyonuna yazılan koordinatlar, sınırlar içerisindeyse True değil ise False değerini döndürmektedir.

>>> pyautogui.size() #Ekran sınırlarımızı (boyutunu) bulduk.
(1366, 768)
>>> pyautogui.onScreen(0, 999999)
False
>>> pyautogui.onScreen(456, 352)
True

Fare Hareketi

moveTo(x,y) fonksiyonu içerisine yazdığımız x ve y koordinatlarına fareyi taşır. Burada x veya y konumu yerine None değeri verirsek imlecin o anki konumunu alarak taşır.

>>> pyautogui.moveTo(100, 200)   # İmleci X 100 ve Y 200 taşır
>>> pyautogui.moveTo(None, 500) # İmleci X 100 ve Y 500 taşır
>>> pyautogui.moveTo(600, None) # İmleci X 600 ve Y 500 taşır

Normalde moveTo() fonksiyonu fare imlecini anında belirtilen koordinatlara taşır. Eğer bunu belirli bir sürede kademeli olarak yapmasını istersek fonksiyona üçüncü bir değişken olan hareket etme süresini atayarak gerçekleştirebiliriz.

>>> pyautogui.moveTo(100, 200, 2) # 2 saniyede X 100, Y 200 koordinatlarına taşı

Eğer fare imlecimizi kendi konumunu referans alarak birkaç piksel hareket ettirmek istersek moveRel() fonksiyonunu kullanırız. Örneğin (100,200) konumunda duran imlecimizi x düzleminde 50px sağa taşımak istersek.

>>> pyautogui.moveRel(50, 0) #50 pixel imleci bulunduğu konumdan sağa taşı

veya

>>> pyautogui.moveRel(-50, 0) #50 pixel fareyi bulunduğu konumdan sola taşı

Fare Sürükleme

PyAutoGUI’de sürükleme fonksiyonları dragTo() ve dragRel(), moveTo() ve moveRel() fonksiyonlarına benzemektedir. Ek olarak fareyi sürüklerken hangi tuşu basılıp sürükleneceği (‘left’, ‘right’, ‘middle’) opsiyonel olarak belirlenebilir.

>>> pyautogui.dragTo(100, 200, button=’left’)     
# farenin sol tuşuna basılı tutarak X 100 Y 200 e sürükler
>>> pyautogui.dragTo(300, 400, 2, button=’left’)
# farenin sol tuşuna basılı tutarak X 300 Y 400e 2 saniyede sürükler
>>> pyautogui.dragRel(30, 0, 2, button=’right’)
# farenin sağ tuşuna basılı tutarak 2 saniye içinde 30 pixel bulunduğu konumdan sağa sürükler

Fare Tıklaması

click() fonksiyonu hiç bir parametre girilmeden çalıştırılırsa bulunduğu konumda farenin sol butonu ile bir tıklama yapar.

>>> pyautogui.click()

İstediğimiz bir koordinata taşıyıp orada tıklama yapmasını istiyorsak.

>>> pyautogui.click(x=100, y=200)
#x 100, y 200 koordinatlarına git ve sonra sol tıkla

Tıklamada sol, sağ ve orta butonlardan herhangi biriyle tıklama yapabilmek için

>>> pyautogui.click(button='right') #Sağ düğme ile tıklar

Birden fazla tıklama yapabilmek için clicks parametresine vereceğimiz değer sayısı kadar tıklama yapar. Bu tıklamalar arasındaki süreyi belirlemek için ise interval parametresine bir saniye değeri atarız.

>>> pyautogui.click(clicks=2)  
# sol buton ile çift tıklama
>>> pyautogui.click(clicks=2, interval=0.25)
# sol buton çift tıklama tıklamaların arasındaki bekleme 0.25sn
>>> pyautogui.click(button='right', clicks=3, interval=0.25)
# sağ buton ile üçlü tıklama ve tıklamalar arasındaki bekleme 0.25sn

mouseDown() ve mouseUp() Fonksiyonları

Fare tıklama ve sürüklemelerinde gerçekleşen olay fare butonuna basılması ve çekilmesi şeklinde iki hareketten oluşmaktadır. Bu basma ve çekme işlemleri kontrol etmek için mouseDown() ve mouseUp() fonksiyonları kullanılır.

Diğer fonksiyonlara benzer olarak x, y ve button parametrelerine sahiptir.

Örneğin farenin sol butonuyla normal bir tıklamayı şu şekilde de yapabiliriz.

>>> pyautogui.mouseDown(); pyautogui.mouseUp()
#Farenin sol butonuna bas (mouseDown()) ve çek (mouseUp())

veya şöyle bir örnek yapalım. Sağ butona basılı tutup (100,200) koordinatlarına gittikten sonra sağ butona basmayı bırakan bir kod;

>>> pyautogui.mouseDown(button='right')
#Sağ butona bas.
>>> pyautogui.mouseUp(button='right', x=100, y=200)
#(100,200) koordinatlarına gittikten sonra farenin sağ butonuna basmayı bırak.

2. Klavye Kontrol İşlevleri

typeWrite() Fonksiyonu

PyAutoGUI ile klavye kontrolü yapmak için bilmemiz gereken ilk ve en önemli fonksiyondur. İçerisine belirttiğimiz metindeki karakterlere basar. Ayrıca bu karakterler arasında bir bekleme girmek istiyorsak interval parametresine atayacağımız değer ile bu beklemeyi belirleyebiliriz.

Örneğin;

>>> pyautogui.typewrite('Merhaba Dünya!')                 
# Anında "Merhaba Dünya" yazdırır.
>>> pyautogui.typewrite('Merhaba Dünya!', interval=0.25)
# Karakterler arası çeyrek saniye bekleyerek "Merhaba Dünya" yazar.

Bu fonksiyonumuz ile Shift, Ctrl veya F1 gibi özel tuşlara basamazsınız.

press(), keyDown(), and keyUp() Fonksiyonu

press() fonksiyonu özel tuşlara (enter, esc, ctrl, shift) basmamızı sağlar. Bu özel tuşların listesine ulaşmak için pyautogui.KEYBOARD_KEYS yazıp bakabilirsiniz.

Örneğin:

>>> pyautogui.press(’enter’)  # Enter tuşuna basar
>>> pyautogui.press(’f1’) # F1 tuşuna basar
>>> pyautogui.press(’left’) # Sol ok tuşuna basar

press() fonksiyonunun yaptığı iş tuşa basıp serbest bırakarak iki işlevden oluşur. Basmak ve serbest bırakmak işlerini kontrol etmek için keyDown() ve keyUp() fonksiyonlarını kullanırız.

Bunu bir örnek üzerinde anlatalım.

Shift tuşuna basılı tutarken Sol ok tuşuna 3 kere basan bir kod yazalım.

>>> pyautogui.keyDown('shift')  # shift tuşuna basılı tut
>>> pyautogui.press('left') # Sol ok tuşuna bas
>>> pyautogui.press('left') # Sol ok tuşuna bas
>>> pyautogui.press('left') # Sol ok tuşuna bas
>>> pyautogui.keyUp('shift') # shift tuşuna basmayı bırak

typewrite() fonksiyonu gibi birden fazla tuşa press() fonksiyonu ile basmak için;

>>> pyautogui.press(['left', 'left', 'left'])

hotkey() Fonksiyonu

Klavye kısayol tuşlarını daha kolay kullanabilmek için oluşturulmuş bir fonksiyondur.

Örneğin Ctrl+Shift+Esc kısayol tuşlarına basmak için;

>>> pyautogui.hotkey('ctrl', 'shift', 'esc')

Burada hotkey() fonksiyonun bize sağladığı avantajı anlamak için gelin aynı işi başka bir yolla yapalım.

>>> pyautogui.keyDown('ctrl')
>>> pyautogui.keyDown('shift')
>>> pyautogui.keyDown('esc')
>>> pyautogui.keyUp('esc')
>>> pyautogui.keyUp('shift')
>>> pyautogui.keyUp('ctrl')

3. Mesaj Kutusu İşlevleri

alert() Fonksiyonu

>>> alert(text='Buraya metin', title='Başlık', button='OK')

Metin, başlık ve tek bir butondan oluşan bir ileti kutusu gösterir. Butona tıklandıktan sonra buton metnini döndürür.

confirm() Fonksiyonu

>>> confirm(text='Buraya metin', title='Başlık', buttons=['OK', 'Cancel'])

Belirtilen butonlar, metin ve başlıktan oluşan metin kutusu. Butonlar birden fazla olabilir. Butonlara tıklandığında sonuç olarak tıklanan butonun metnini gönderir.

prompt() Fonksiyonu

>>> prompt(text='Burası metin', title='Başlık')

“Ok” ve “Cancel” butonlarının bulunduğu metin kutusu. “Ok” butonuna tıklandığında sonuç olarak girilen metni, “Cancel” butonuna tıklandığında None değerini döndürür.

password() Fonksiyonu

>>> password(text='Burası metin', title='Başlık', mask='*')

“Ok” ve “Cancel” butonlarının bulunduğu metin kutusu. prompt() fonksiyonundan tek farkı yazılan metinler “*”olarak görüntülenir. “Ok” butonuna tıklanır ise metni, “Cancel” butonuna tıklanır ise None değerini sonuç olarak döndürür.

4. Ekran Görüntü İşlevleri

PyAuytoGUI, ekran görüntüleri almaya, kaydetmeye ve kayıtlı resimleri ekran görüntüsü içerisinde bulmaya da yarar. Bütün bu işlemleri yapmak için PyAutoGUI’yi yüklerken kurulan PyScreeze kütüphanesini kullanarak yapmaktadır.

screenshot() Fonksiyonu

Ekran görüntüsünü almak için kullanacağımız fonksiyondur. Bir örnekle açıklamak gerekirse.

>>> import pyautogui
>>> resim = pyautogui.screenshot('ekran_goruntum.png')

Bu işlemi python konsolunda yaptığınızda fotoğrafı python’nun yüklü olduğu dizine kaydeder.

Bazen ekranının sadece belirli bir kısmının görüntüsünü almak istersiniz. Bu gibi durumlar için ise region argümanını kullanacağız. Burada vereceğimiz değerilerin ilk ikisi x, y başlangıç koordinatını daha sonra vereceğimiz iki değer ise ilki x ekseni boyunca (sağa doğru) genişliğini, ikincisi ise y ekseni boyunca (aşağı doğru) yüksekliğini belirtir.

>>> import pyautogui
>>> resim = pyautogui.screenshot("goruntu.png", region=(0,0, 100, 500))

locate…() Fonksiyonları

Elinizde bir görüntü varsa ve bu görüntü ekranda yer alıyorsa görüntüyü çok kolay bir şekilde bulabilirsiniz. Örneğin aşağıdaki gibi bir hesap makinesi açtık.

Hesap makinesi

Buradaki 7 tuşuna basmak istiyoruz.

Bunun için moveTo() ve click() fonksiyonlarını kullanarak bu tuşun üzerine imleci getirip tıklama yapabiliriz. Fakat hesap makinesi farklı konumda açılabilir veya farklı bir konuma sürüklenmiş olabilir. Değişken bu durumlar için locateOnScreen() fonksiyonunu kullanacağız. Bu fonksiyon içerisine tanımladığımız resmin koordinatlarını bulur. Böylece hesap makinesinin yeri farklı dahi olsa “7” tuşunun resmini fonksiyonumuz tanıyacak ve koordinatlarını bize verecek.

Dediklerimizi koda dökecek olursak.

>>> import pyautogui
>>> button7location = pyautogui.locateOnScreen('calc7key.png')
>>> button7location
(1416, 562, 50, 41)
>>> button7x, button7y = pyautogui.center(button7location)
>>> button7x, button7y
(1441, 582)
>>> pyautogui.click(button7x, button7y)

locateCenterOnScreen() ise işimizi kolaylaştırıcı bir fonksiyon.

>>> import pyautogui
>>> x, y = pyautogui.locateCenterOnScreen('calc7key.png')
>>> pyautogui.click(x, y)

Kısaca;

  • locateOnScreen(image, grayscale=False): Ekranda bulunan ilk görüntünün (sol,üst, genişlik, yükseklik) koordinatlarını sonuç olarak döndürür. Bulamaz ise None (boş) değer döndürür.
  • locateCenterOnScreen(image, grayscale=False): Ekranda bulunan ilk görüntünün (x,y) merkez koordinatlarını döndürür. Bulamaz ise None (boş) değer döndürür.
  • locateAllOnScreen(image, grayscale=False): Ekranda bulunan görüntülerin hepsini bir tuple olarak döndürür. Görüntülerin (sol,üst, genişlik, yükseklik) koordinatlarını verir.

Gri Ölçeklendirme

Resimleri siyah beyaz bir resme çevirmek için grayscale=True argümanını kullanmamız yeterlidir. Bu resimleri tanımada hızımızı %30'a kadar arttırabilir fakat tanıma oranlarını düşürebilir.

>>> import pyautogui
>>> button7location = pyautogui.locateOnScreen('calc7key.png', grayscale=True)
>>> button7location
(1416, 562, 50, 41)

Kaynaklar

  1. https://automatetheboringstuff.com/chapter18/
  2. https://pyautogui.readthedocs.io/en/latest/mouse.html

Yazılar bolca yazar tarafından yorum katılarak yukarıdaki kaynaklardan içerikle fazla oynama yapılmadan Türkçeleştirilmiştir.

--

--