Python Pynput modülü hakkında

from pynput import keyboard
from PIL import ImageGrab

def on_release(tus):
    if tus.char == "a":
        alinti = ImageGrab.grab()
        alinti.save("c:/users/pc/desktop/Alinti.jpg", "JPEG")
        print("Ekran alıntısı alındı!!!")


with keyboard.Listener(on_release=on_release) as listener:
    listener.join()

Arkadaşlar bu kod özel karakter kullandığımda (alt,sift,delete vb.) sonlanıyor bunu nasıl çözebilirim verdiği hatayı da aşağıya bırakıyorum.

C:\Users\PC\Desktop\Pycharm2\venv\Scripts\python.exe C:/Users/PC/Desktop/Pycharm2/Calisma.py
aEkran alıntısı alındı!!!
Ekran alıntısı alındı!!!
Ekran alıntısı alındı!!!
Ekran alıntısı alındı!!!
Unhandled exception in listener callback
Traceback (most recent call last):
  File "C:\Users\PC\Desktop\Pycharm2\venv\lib\site-packages\pynput\_util\__init__.py", line 211, in inner
    return f(self, *args, **kwargs)
  File "C:\Users\PC\Desktop\Pycharm2\venv\lib\site-packages\pynput\keyboard\_win32.py", line 283, in _process
    self.on_release(key)
  File "C:\Users\PC\Desktop\Pycharm2\venv\lib\site-packages\pynput\_util\__init__.py", line 127, in inner
    if f(*args) is False:
  File "C:/Users/PC/Desktop/Pycharm2/Calisma.py", line 5, in on_release
    if tus.char == "a":
AttributeError: 'Key' object has no attribute 'char'
Traceback (most recent call last):
  File "C:/Users/PC/Desktop/Pycharm2/Calisma.py", line 12, in <module>
    listener.join()
  File "C:\Users\PC\Desktop\Pycharm2\venv\lib\site-packages\pynput\_util\__init__.py", line 259, in join
    six.reraise(exc_type, exc_value, exc_traceback)
  File "C:\Users\PC\Desktop\Pycharm2\venv\lib\site-packages\six.py", line 702, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\PC\Desktop\Pycharm2\venv\lib\site-packages\pynput\_util\__init__.py", line 211, in inner
    return f(self, *args, **kwargs)
  File "C:\Users\PC\Desktop\Pycharm2\venv\lib\site-packages\pynput\keyboard\_win32.py", line 283, in _process
    self.on_release(key)
  File "C:\Users\PC\Desktop\Pycharm2\venv\lib\site-packages\pynput\_util\__init__.py", line 127, in inner
    if f(*args) is False:
  File "C:/Users/PC/Desktop/Pycharm2/Calisma.py", line 5, in on_release
    if tus.char == "a":
AttributeError: 'Key' object has no attribute 'char'

Process finished with exit code 1

Özel tuşlar hariç her şey kullanılabiliyor.

Cevaptan emin olmamakta beraber;

Shift gibi tuşlar string isme sahip olduğu için olabilir mi? Yani a tuşu gibi char değiller.

1 Beğeni

dokümantasyonda dediğine göre Handling the keyboard — pynput 1.7.6 documentation

The key parameter passed to callbacks is a pynput.keyboard.Key for special keys, a pynput.keyboard.KeyCode for normal alphanumeric keys

yani “özel” tuşlar için, ki şunlar oluyor onlar

[(special_key.value, special_key.name) for special_key in keyboard.Key]

on_release fonksiyonuna keyboard.Key objesi gönderiliyor, bunun da alttirelileri saymazsak sadece name ve value diye öznitelikleri var (enum üyesi zira) ve char diye bir özniteliği yok.

Dolayısıyla on_release fonksiyonunda tusun tipine bakıp öyle şekil alabilirsiniz (lbyl) veya direkt try-except ile dalabilirsiniz (eafp).

2 Beğeni

from pynput.keyboard import Keys

Bunu kodların en başına ekleyin

1 Beğeni

Bu işe yaramadı. Hala özel karaktere basıldığında program sonlanıyor.

kodu nasıl modifiye ettiğinizi buraya yazabilir misiniz

Çünkü tus.char yapmışsınız. orayı str(tus) olarak değiştirin ve o en başta dediğim satırı ekleyin. Kesinlikle düzelecektir

try except ile sorunu çözdüm.

from pynput import keyboard
from PIL import ImageGrab
from datetime import datetime
import locale
import os
locale.setlocale(locale.LC_ALL,'')
desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
try:
    os.makedirs(desktop + "/Ders Alıntılarım/Almanca")
    os.makedirs(desktop + "/Ders Alıntılarım/Matematik")
    os.makedirs(desktop + "/Ders Alıntılarım/Edebiyat")
    os.makedirs(desktop + "/Ders Alıntılarım/İngilizce")
    os.makedirs(desktop + "/Ders Alıntılarım/Kimya")
    os.makedirs(desktop + "/Ders Alıntılarım/Biyoloji")
    os.makedirs(desktop + "/Ders Alıntılarım/Fizik")
    os.makedirs(desktop + "/Ders Alıntılarım/Tarih")
    os.makedirs(desktop + "/Ders Alıntılarım/Coğrafya")
    os.makedirs(desktop + "/Ders Alıntılarım/Din Kültürü")
    os.makedirs(desktop + "/Ders Alıntılarım/Felsefe")
    os.makedirs(desktop + "/Ders Alıntılarım/Müzik")
    os.makedirs(desktop + "/Ders Alıntılarım/Beden Eğitimi")
except FileExistsError:
    pass
print("""
**************************
                         *
Ekran Fotoğrafı Ayırıcı  *
                         *
 yapan =>     ?          *     
                         *
**************************



""")
print("""
Alıntı için ders seçimi;

Edebiyat => e , E
Matematik => m , M
Biyoloji => b , B
Fizik => f , F
Kimya => k , K
İngilizce => i , İ
Almanca => a , A
Tarih => t , T
Coğrafya => c , C
Din Kültürü => d , D
Felsefe => l , L
Müzik => ü , Ü
Beden Eğitimi => n , N
Çıkış => ç , Ç
""")
def on_release(tus):
    try:
        if tus.char == "a" or tus.char == "A":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Almanca/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "m" or tus.char == "M":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Matematik/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "e" or tus.char == "E":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Edebiyat/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "i" or tus.char == "İ":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/İngilizce/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "k" or tus.char == "K":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Kimya/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "b" or tus.char == "B":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Biyoloji/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "f" or tus.char == "F":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Fizik/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "t" or tus.char == "T":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Tarih/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "c" or tus.char == "C":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Coğrafya/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "d" or tus.char == "D":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Din Kültürü/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "l" or tus.char == "L":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Felsefe/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "ü" or tus.char == "Ü":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Müzik/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "n" or tus.char == "N":
            gun = datetime.now()
            tarih = datetime.strftime(gun,'%d %B %Y %X')
            tarih = tarih.replace(':','-')
            alinti = ImageGrab.grab()
            alinti.save("{}/Ders Alıntılarım/Beden Eğitimi/{}.jpg".format(desktop,tarih), "JPEG")
            print("Ekran alıntısı alındı!!!")
        elif tus.char == "ç" or tus.char == "Ç":
            exit()
    except AttributeError:
        pass

with keyboard.Listener(on_release=on_release) as listener:
    listener.join()

Bu da programın son hali yeni bir konu açacağım bu program ile ilgili tekrar yardım ederseniz mutlu olurum.

Teşekkürler!

Güzel olmuş ss alıcı sanırsam

1 Beğeni

knkm try exceptlerle kodlarını boğmana gerek yok. on_release fonksiyonuna parametre olarak gidey tus nesnesinin zaten içinde str fonksiyonu var. Sen str(tus) yazınca tus.char yazmana gerek kalmıycak. Tüm tus.char ları kaldırıp yerine str(tus) yaz. Birde her koşulda or kullanmana gerek yok. str(tus).lower() == “ç” gibi bişey yapmak daha kolay olacaktır.

1 Beğeni

çalışmaz bu

bu da çalışmaz

düzelmez

1 Beğeni

Burada haklısın öncesinde lower() gibi bir araç olduğunu bilmiyordum sonrasında öğrendim öncesinde dediklerine gelince onları denedim ama çalışmadı. Yine de sağ ol🙂

:slight_smile: Bilmiyorsan bari konuşma be dostum.
Bu kodlar güncel kullandığım bir projemden

def on_press(self, key):
        time = datetime.strftime(datetime.now(), "%d.%m.%y - %X").replace(":", ".") + " $" + str(self.generalcounter)
        if key == Key.enter:
            ImageGrab.grab().save(self.image_path+f"User={self.login} Year={self.year} Time={self.time} ${self.generalcounter}"+".jpeg")
        self.generalcounter += 1
        self.upcounter += 1
        self.file.write(str(time) + " " + str(key) + "\n") # Dosyaya yazar
        if self.upcounter == 100: #upload sayacı 100 olduğunda
            Thread(target=self.upload).start() # dosyaları upload eder
            self.upcounter = 0 # upload sayacını tekrar sıfırlar

Bunlarda ilgili içe aktarmalar

from pynput.keyboard import Key, Controller
from pynput import keyboard

Keys diye bir şeyi import etmeyi tavsiye ediyorsunuz öyle bir şey yok ki. Key import edilse dahi sorunun çözümüne bir katkısı yok

str(tus) deyip if ile karşılaştırdığınız kısım nerede?

Burda key i str ile alıyorsan karşılaştıradabilirsin.

Bunuda yanlış yazmışım zaten yazarken Keys yerine Key olduğunu kullandığı editor muhtemelen söyleyecektir.

onu söyleyebilen editör “Key imported but not used” da der heralde

key dediğiniz şey on_release fonksiyonuna otomatik gelmiyor mu listener sayesinde? str ile almaktan kastınız nedir? Şunu mu kastediyorsunuz

if str(key) == "a":
    ...

tamam key i içeri aktarmak gerekmediğinde sen haklıymışsın. o kontrol aşamasında gerekiyormuş.

from pynput import keyboard
from PIL import ImageGrab

def on_release(tus):
    if str(tus) == "'a'":
        ImageGrab.grab().save(f"C:/Users/{__import__('os').getlogin()}/Desktop/Alinti.jpg")
        print("Ekran alıntısı alındı!!!")
    if str(tus) == "Key.enter":
        print("Do anything")
        
with keyboard.Listener(on_release=on_release) as listener:
    listener.join()

Kodun çalışır hali burda. Enter gibi tuşları kontrol etmek içinde burayı 2. if bloğunu kullanabilirsin.