Olen vanha Basic-käyttäjä ja pakotettu uuden ohjelmiston käyttöönottoon. siispä voisiko joku kertoa miten koodaan pythoniin näppiskeskeytyksen ja sille funktion (ohjelmakohdan), johon sen pitää hypätä. Löysin netistä Try ja Except-textiä mutta englannin kielen taitoni ei oikein taivu saadakseni tolkkua em tekstistä.
Avusta kiitollinen
Elekroonikko
Tarkoitatko siis näppiskeskeytyksellä sitä kun käyttäjä pyytää lopettamaan konsoliohjelman ctrl+c -painalluksella?
Ehkä jotenkin tähän tyyliin
import time, sys x = 1 while True: try: print x time.sleep(.3) x += 1 except KeyboardInterrupt: print "Bye" sys.exit()
Jos haluat havaita ohjelman lopetuksen myös muilla, niin esim tälleen:
import signal import sys def signal_handler(sig, frame): print('You pressed Ctrl+C!') sys.exit(0) signal.signal(signal.SIGINT, signal_handler) print('Press Ctrl+C') signal.pause()
Tuo keskeytys pitäisi tapahtua ohjelman suorituksen aikana ( = käytön aikana), kun käyttäjä haluaa asettaa uuden päiväyksen ohjelmaan. Keskeytyksestä pitäisi hypätä päiväyksen ja kellonajan sisäänkirjoitukseen (päivitykseen) ja sen jälkeen ohjelma taas siirtyy pyörittämään kelloa. Alustana Raspberry Pi 1 ja käyttöjärjestelmänä uusin Raspian.
Sopiiko noista esimerkeistä kumpikaan tällaiseen käyttöön?
Kyselee Elekroonikko
DOS-ajan keskeytykset (interrupt, IRQ) ovat historiaa kielestä riippumatta. Nykyään yleensä käytetään esimerkiksi säikeitä.
Mielestäni kun tässä nyt on erikseen Raspberryπ mainittu, niin olisi hyvä tietää vähän tarkemmin, miten systeemi on toteutettu.
Jos kyseessä on USB-näppäimistö ja softa joka toimii siinä konsolissa jota näppäimistöllä käytetään, niin sitten tosiaan varmaan yksinkertaisinta olisi pääsäikeessä vaan keskittyä käyttäjän kanssa jutteluun (näppäimistön lukemiseen) ja taustalla toisessa säikeessä päivitellä kelloa. Tässä tapauksessa ei tosin ole lainkaan relevanttia että missä käyttiksessä tai laitteessa softa pyörii.
Jos taas näppäimistö on joku erikoisempi Rπ:n GPIO-pinneihin kytketty näppäimistö tms, niin tilanne on jokseenkin erilainen.
Näppäimistö on ihan tavallinen USB-näppis , joka voidaan kytkeä vauhdissa Raspberryyn jos tarvetta ilmenee. Tuo nimitys keskeytys on minulla tosiaan DOS-kaudelta mutta tarkoitan sillä tosiaan toimintaa, joka pysäyttää kellon juoksun ja jää odottamaan käyttäjän toimenpiteitä, joiden jälkeen kello alkaa taas pyöriä.
Tuo sana säie on englanniksi ilmeisesti thread ja tuolla varmaan löydän netistä tietoa tuon ohjelmointitavan käyttämisestä. Jos jollakulla on hyvä sivu tiedossa, josta tuosta rinnakkais-koodaamisesta Pythonilla saa lisää tietoa niin voisi kertoa täällä.
Elekroonikko
Lisäys:
Okei, Okei netti on väärällään tuosta Pythonin säie-jutusta eli tekstiä löytyy.
Toivon voivani palata asiaan jollen saa päähäni tuota hommaa ja ohjelmaani toimimaan. Ymmärryksessäni ei kuitenkaan ole mitään vikaa mutta tuo päässäni oleva Basicci ei tahdo sitten millään luovuttaa paikkaansa nuoremmille.
Elekroonikko
Toisaalta jos haluat tosiaan että ohjelman suoritus pysähtyy täysin siksi aikaa kun käyttäjä käyttää näppäimistöä, niin silloin on helpompaa olla käyttämättä säikeitä ja tarkistaa vaan pääloopissa että onko käyttäjä painanut näppäimistöä.
import keyboard # käytetään moduulia keyboard while True: # "ikuinen" looppi try: if keyboard.is_pressed('q'): # painettiinko näppäintä 'q' print('painoit näppäintä q!') break else: pass except: break # jos painettiin jotain muuta näppäintä poistutaan.
Jotenkin epäilen että suurimmaksi ongelmaksi voi muodostua tuo että prosessi ilmeisesti halutaan käynnistää taustalla, jolloin näppäimistön syöte ei oletusarvoisesti ohjaudu sille.
Kiitos! Tuo vaikuttaa siltä mitä vähän ajattelinkin. Etsin jo pythonista basicin Inkey$ vastaavaa prosessia ja tuohan taitaa sellainen olla.
Elekroonikko
Vielä jos vähän saisi avitusta.... Tulkki väittää ettei se löydä tuota keyboard modulia.
pi@raspberrypi:~ $ pip3 install keyboard Collecting keyboard Using cached https://files.pythonhosted.org/packages/8d/14/b7a8f46e750b5905b099f0ae164a00bc99fe2a3029b4d54ae978797d2c15/keyboard-0.13.3-py2.py3-none-any.whl Installing collected packages: keyboard Successfully installed keyboard-0.13.3
Traceback (most recent call last): File "/home/pi/Monitekstirivi4.py", line 13, in <module> import keyboard # käytetään moduulia keyboard ImportError: No module named 'keyboard' >>>
Toinen seikka, joka kiinnitti huomiotani on ettei tuossa alasladatussa modulissa ole funktiota "keyboard.is_pressed()".
Miten saan tuon toiminnon aikaiseksi?
Elekroonikko
Onko mahdollista, että kaikesta huolimatta vahingossa ajaisit koodiasi Python 2:lla? Jos tiedoston alussa on #!-rivi (shebang), varmista, että siinäkin on nimenomaan python3 mainittu.
Minulla nimittäin kirjasto näyttää latautuvan ihan odotusten mukaan:
user@k-pipi:~$ pip3 install --user keyboard Collecting keyboard Using cached https://files.pythonhosted.org/packages/8d/14/b7a8f46e750b5905b099f0ae164a00bc99fe2a3029b4d54ae978797d2c15/keyboard-0.13.3-py2.py3-none-any.whl Installing collected packages: keyboard Successfully installed keyboard-0.13.3 user@k-pipi:~$ python3 Python 3.7.3 (default, Mar 29 2019, 06:12:40) [GCC 8.2.1 20181127] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import keyboard >>> keyboard.is_pressed <function is_pressed at 0x76068270>
Toki tämän kirjaston käyttö vaatii pääkäyttäjän oikeudet, joten ihan mihin tahansa ohjelmaan ei kannata tätä käyttää.
En löydä tuollaista merkintää mistään kuin "#!-rivi (shebang)". Olen käynnistänyt python version 3.5.3 eikä minulla ole käsitystä siitä miten se eroaa 3.7.3:sta.
Onko mahdollista vaikka käyttis ilmoitti modulin onnistuneesta asennuksesta että se jostain syystä ei kuitenkaan ole käytettävissä?
Siis millä tavalla olet käynnistänyt Pythonin? Nyt olet selvästi ajanut kooditiedoston Monitekstirivi4.py, mutta miten olet saanut tämän käyntiin? Ajoitko tiedoston komentorivillä vai klikkaamalla tiedostoselaimesta vai jotenkin muuten?
Ei ole merkitystä asian kannalta, onko käytössä 3.5 vai 3.7. Kuitenkin sinulla saattaa olla asennettuna myös ei-yhteensopiva 2.7, jolloin pitää olla tarkkana, että ohjelma ajetaan oikealla versiolla.
Yleensä tiedoston ensimmäisellä rivillä kerrotaan, millä tulkilla koodi kuuluu ajaa. Tällöin esimerkiksi tiedoston klikkaaminen tiedostoselaimessa käynnistää todennäköisemmin oikean tulkin. Rivi voi olla vaikka tällainen:
#!/usr/bin/python3
Voit tarkastaa myös ohjelmassa, mikä Pythonin versio on käytössä ja mistä moduuleita haetaan.
import sys print(sys.version) print(sys.path)
Jos versio on väärä, tarkasta edellä kuvatulla tavalla, että käynnistät ohjelman oikein. Jos versio on oikea, pitää tutkia löytyykö ladattu paketti näistä poluista vai missä on vika.
Okei selvisi jo: latauksessa tiedosto tallentui Python 3 -kansioon ja polut on osoitettu python 3.5:een kansioon. Keyboard.py sijaitsee "disk-packakes"-kansiossa mutta python 3.5-kansiossa ei ole saman nimistä alihakemistoa. mihinkähän kansioon se pitäisi kopioida ja lopuksi vielä kannattaisiko nuo aiemmat versiot poistaa muistikortilta?
Ja vielä siitä käynnistyksestä: yksinkertaisesti olen käynnistänyt kirjoittamani koodin F5-painikkeella. Lisäsin myös tuon "#!/usr/bin/python3" kirjoittamani koodin alkuun.
Minulle jää kuvauksestasi aika epäselväksi, mitä polkuja olet löytänyt. ”Python 3 -kansio” ei kerro Linuxin tiedostojärjestelmässä vielä juuri mitään.
Tässä on vielä esimerkkinä, mitä pitäisi löytää. (Poistin turhia osia tekstistä.)
user@k-pipi:~$ pip3 show keyboard Location: /usr/lib/python3.7/site-packages user@k-pipi:~$ python3 <<< 'import sys; print(sys.path)' ['', '/usr/lib/python3.7', '/usr/lib/python3.7/site-packages']
Eli pip3 näyttää paketin asennuspaikaksi /usr/lib/python3.7/site-packages, ja tämä polku löytyy myös muuttujassa sys.path olevasta listasta. Millaiset polut saat näillä komennoilla?
Mulla komennot tulostaa seuraavanlaiset rotlat:
pi@raspberrypi:~ $ pip3 show keyboard Name: keyboard Version: 0.13.3 Summary: Hook and simulate keyboard events on Windows and Linux Home-page: https://github.com/boppreh/keyboard Author: BoppreH Author-email: boppreh@gmail.com License: MIT Location: /home/pi/.local/lib/python3.5/site-packages Requires: pi@raspberrypi:~ $ python3 <<< 'import sys; print(sys.path)' ['', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-arm-linux-gnueabihf', '/usr/lib/python3.5/lib-dynload', '/home/pi/.local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages'] pi@raspberrypi:~ $
Ja on siellä kuitenkin joukosssa tuo Python3 hakemisto viimoisena.
Lisäys: niin ja edelleen tulee valitus ettei tuota keyboardia ole olemassa....
Tuloste näyttää oikealta. Olisiko vika kuitenkin tuossa kehitysympäristössä niin, että F5:llä käynnistys vain tekee jotain väärin? Kokeile vielä käynnistää ohjelmasi komentoriviltä komennolla python3 Monitekstirivi4.py. (Oikeastaan sudo python3 ..., koska muuten tuo kirjasto ei toimi.)
Result: no module named 'keyboard'
Lisäys:
Selasin taas vähän nettiä ja törmäsin tollaseen:
https://pythonhosted.org/pynput/keyboard.html
Pitää sitäkin kokeilla....
Aihe on jo aika vanha, joten et voi enää vastata siihen.