Näppäimistön lukeminen
461 531 626
Pythonilla voidaan lukea käyttäjän kirjoittamia syötteitä input()-funktiolla, kuten ensimmäisessä sessiossa jo tehtiinkin. Tämä funktio tulostaa sille parametrinä annetun tekstin ja jää odottamaan käyttäjän syötettä, joka päätetään enter-painikkeen painalluksella.
Ottamalla käyttöön pynput-paketti, voidaan näppäimistöä lukea merkki kerrallaan. Pynput-paketissa on myös hiiren tapahtumia lukeva osio. Tämän sivun harjoituksessa tehdään ohjelma, joka jää "kuuntelemaan" näppäinten painalluksia ja reagoi niihin tulostamalla, mitä näppäintä on painettu.
Python.org-sivustolla on linkki PyPI-sivustolle (
Pythonin toiminnallisuutta voidaan helposti laajentaa asentamalla "lisäosia" (joita Pythonin yhteydessä kutsutaan paketeiksi, package) pip (
cmd
pip install pynput
Mikäli IDLEn asennusvaiheessa valittiin kohta Add Python 3.8 to PATH (ks. kuva), pip-ohjelma käynnistyy mistä tahansa kansiosta käsin. Jos kohtaa ei valittu, pip käynnistyy vain pip-ohjelman sijaintikansiosta käsin (esimerkiksi C:\Users\käyttäjätunnus\AppData\Local\Programs\Python\Python38-32\Scripts):
cmd
cd C:\Users\käyttäjätunnus\AppData\Local\Programs\Python\Python38-32\Scripts
pip install pynput
from pynputimport keyboard# Määritellään kaksi funktiota, joita kutsutaan Listeneristä. # # Funktiota nappainta_painettu() kutsutaan, kun jotain näppäintä on painettu ja # funktiota nappain_vapautettu(), kun sormi nostetaan näppäimeltä. def nappainta_painettu (nappain):try : teksti ="Näppäintä {} painettu" # Valmistellaan muotoiltua tulostusta # nappain.char muuntaa näppäinkoodin tulostettavaksi # merkiksi. Funktionäppäinten tai muiden erikois- # näppäimien koodeja ei voi muuttaa tulostettavaksi # merkiksi, vaan ne aiheuttavat AttributeError- # virheen, joka käsitellään except-lohkossa. except AttributeError : teksti ="Erikoisnäppäintä {} painettu" # Erikoisnäppäimet tulostetaan koodimuodossa # käyttämättä char-metodia def nappain_vapautettu (nappain):# Muuten samanlainen kuin nappainta_painettu()- # funktio, mutta erikoisnäppäinten vapauttamisesta # ei tulosteta mitään. try : teksti ="Näppäin {} vapautettu" except AttributeError :if nappain == keyboard.Key.esc:# Sen sijaan tarkistetaan, josko painettu "<esc> painettu, lopetetaan" )# näppäin oli <Esc>-näppäin. return False # Jos oli, palautetaan funktiota kutsuneeseen # ohjelmaan False , mikä pysäyttää Listenerin # toiminnan. # PÄÄOHJELMA, jossa luodaan ja käynnistetään näppäimistön kuuntelija (non-blocking mode) kuuntelija = keyboard.Listener(# Luodaan Listener-tyyppinen muuttuja kuuntelija ja on_press=nappainta_painettu,# määritellään se kutsumaan funktioita, kun on_release=nappain_vapautettu)# näppäintä painetaan tai näppäin vapautetaan. kuuntelija.start()# Käynnistetään kuuntelija. Se jää suoritukseen, # kunnes Listener-metodin suoritus lakkaa - mikä # tapahtuu, kun <Esc>-näppäintä painetaan. # Tunneilla PÄÄOHJELMA toteutettiin with -käskyllä, jonka toiminta on hieman hankalampi ymmärtää. # Tämä alla oleva toteutus on siis vaihtoehto yllä esitetylle PÄÄOHJELMAlle. # Käytä omassa ohjelmassasi vain jompaa kumpaa, älä molempia! # PÄÄOHJELMA, jossa luodaan ja aktivoidaan näppäimistön kuuntelija (blocking mode) with keyboard.Listener(# with-käsky luo keyboard.Listener-tyyppisen on_press=nappainta_painettu,# muuttujan, kuten yllä esitetyssä PÄÄOHJELMAssa, ja on_release=nappain_vapautettu,# suorittaa sitten lohkonsa käskyt. suppress= True )as kuuntelija: kuuntelija.join()# join() pitää kuuntelijan käynnissä omana säikeenään # (thread), kunnes Listener-metodin suoritus lakkaa # - mikä tapahtuu, kun <Esc>-näppäintä painetaan. Päivitetty 21.11.2023 © Timo Heikkinen | timo piste heikkinen at oamk piste fi