Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python, curtsies: Esc-näppäimen lukeminen

Jaska [08.10.2017 15:06:58]

#

Haluaisin harjoituksen vuoksi tehdä Python-ohjelman, jonka voisi lopettaa escillä. Miten seuraava yritykseni korjataan, ja miksi tuo ohjelma sotkee komentorivikehoitteen siten, että en ohjelman suorittamisen jälkeen näe enää kirjoittamaani tekstiä Yakuakessa, jonka päällä ajoin ohjelmaa?

from curtsies import Input

def main():
    with Input(keynames='curses') as input_generator:
        for e in input_generator:
            print(repr(e))
            if repr(e) == "u'2'":
                print("Kakkonen")
                exit(0)
            if repr(e) == "u'\x1b'":
                print("ESC")
                exit(0)

if __name__ == '__main__':
    main()

Metabolix [08.10.2017 16:23:10]

#

Vertailu ei toimi repr-viritelmien takia. Ota repr ja ylimääräiset lainausmerkit pois vertailuista.

# Kun Esc-näppäintä painetaan, e-muuttujan sisällöksi tulee Unicode-merkki 1b.
e = u'\x1b'

# Oikea vertailu ilman repr-viritelmiä:
if e == u'\x1b':
	print("moi")

# Väärässä vertailussasi muutat muuttujat tekstiksi.
# Katsotaanpa, mitä nämä tekstit sisältävät:
mychr = lambda c: c if ord(c) >= 0x20 else "erikoismerkki"
hexdump = lambda s: "  ".join("%02x (%s)" % (ord(c), mychr(c)) for c in s)
print(hexdump(repr(e)))   # sisältää merkit: ' \ x 1 b '
print(hexdump("u'\x1b'")) # sisältää merkit: u ' erikoismerkki '

Terminaali taas menee yleensä sekaisin siksi, että tällainen näppäinten välitön lukeminen vaatii tiettyjä erityisasetuksia, jotka pitää palauttaa ohjelman sulkeutuessa. Luultavasti tuo Input-luokka kyllä korjaa tilanteen, jos pystyy, mutta ainakin exit-kutsun kohdalla näyttää käyvän niin, että ohjelma ehtii jo sulkea syötevirran ennen asetusten palauttamista. Ohjelma toimii siis paremmin, jos et käytä main-funktiossa exitiä vaan returnia:

from curtsies import Input
def main():
    with Input(keynames='curses') as input_generator:
        for e in input_generator:
            print(repr(e))
            if e == u'2':
                print("Kakkonen")
                return 0
            if e == u'\x1b':
                print("ESC")
                return 0
    return 0
if __name__ == '__main__':
    exit(main())

Muistathan aina kertoa, onko kyseessä Python 2 vai Python 3. Nyt koodissa on piirteitä molemmista. Ratkaisu onneksi on tällä kertaa molemmille sama.

Vastaus

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

Tietoa sivustosta