Tietokoneiden näyttöjä, joissa näkyy kuvaa automaatiolaboratorion laitteistosta. Monitoreiden takana näkyy sama laitteisto kuin kuvissa.

timohei.net / Opintojaksot / Soveltava ohjelmointi / Python-ohjelmointi /
Näppäimistön lukeminen

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.

pynput

Python.org-sivustolla on linkki PyPI-sivustolle (Python Package Index), jonka haun avulla voidaan etsiä näppäimistön käsittelyyn liittyviä paketteja esimerkiksi hakusanalla keyboard. Tämän kirjoittamisen hetkellä (tammikuu 2020) keyboard-haku antaa tuloksena 679 projektia. Tässä harjoituksessa käytetään pakettia pynput, jonka luonnollisesti löytää helpoiten antamalla hakusanaksi pynput. Haku antaa tulokseksi useita projekteja, joiden kuvauksissa viitataan pynput-kirjastoon, mutta jos haun lajitteluavaimena on Relevance, tulee varsinainen pynput-paketti ensimmäiseksi tulokseksi. pynput-linkkiä klikkaamalla pääsee sivulle, jolla on paketin avulla toteutettuja esimerkkejä. Sivulla on myös linkki varsinaiseen pynput-dokumentaatioon.

pynput-paketin asentaminen

Pythonin toiminnallisuutta voidaan helposti laajentaa asentamalla "lisäosia" (joita Pythonin yhteydessä kutsutaan paketeiksi, package) pip (pip installs Python)

  1. Avaa komentoikkuna näppäämällä + R
  2. Anna komento
    cmd

    ja klikkaa OK
  3. Avautuu Windowsin komentokehote.
  4. Kirjoita siihen käsky
    pip install pynput

    ja paina Enter
  5. pynput asentuu

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):

  1. Avaa komentoikkuna näppäämällä + R
  2. Anna komento
    cmd

    ja klikkaa OK
  3. Avautuu Windowsin komentokehote.
  4. Siirry pip.exe:n sisältämään kansioon komennolla
    cd C:\Users\käyttäjätunnus\AppData\Local\Programs\Python\Python38-32\Scripts

    Huomaa, että polku voi olla Python-version mukaan erilainen!
  5. Anna käsky
    pip install pynput
  6. pynput asentuu

Näppäimistöä "kuunteleva" sovellus

from pynput import 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 print(teksti.format(nappain.char)) # 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" print(teksti.format(nappain)) # 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" print(teksti.format(nappain.char)) except AttributeError: if nappain == keyboard.Key.esc: # Sen sijaan tarkistetaan, josko painettu print("<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

<<  Edellinen
(13) Paketti - moduuli - kirjasto
Sivu 14/17Seuraava >>
(15) Python vs. muut kielet
© Timo Heikkinen | timo piste heikkinen at oamk piste fi