Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Näppiskeskeytys (Python 3.5)

Sivun loppuun

MaraiMasa [09.05.2019 13:01:42]

#

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

Grez [09.05.2019 13:18:29]

#

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

MaraiMasa [09.05.2019 13:43:31]

#

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

Metabolix [09.05.2019 17:33:22]

#

DOS-ajan keskeytykset (interrupt, IRQ) ovat historiaa kielestä riippumatta. Nykyään yleensä käytetään esimerkiksi säikeitä.

Grez [09.05.2019 17:51:09]

#

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.

MaraiMasa [09.05.2019 18:06:05]

#

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

Grez [09.05.2019 20:06:55]

#

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.

MaraiMasa [09.05.2019 23:04:52]

#

Kiitos! Tuo vaikuttaa siltä mitä vähän ajattelinkin. Etsin jo pythonista basicin Inkey$ vastaavaa prosessia ja tuohan taitaa sellainen olla.

Elekroonikko

MaraiMasa [10.05.2019 13:25:54]

#

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

Metabolix [10.05.2019 13:41:18]

#

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ää.

MaraiMasa [10.05.2019 14:58:29]

#

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ä?

Metabolix [10.05.2019 15:23:23]

#

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.

MaraiMasa [10.05.2019 15:57:09]

#

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.

Metabolix [10.05.2019 17:29:10]

#

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?

MaraiMasa [10.05.2019 19:29:54]

#

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....

Metabolix [11.05.2019 05:24:22]

#

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

MaraiMasa [11.05.2019 07:12:05]

#

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....


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta