# PyConio: konzolos megjelenítő modul

Bognár Márton, Czirkos Zoltán · 2023.01.13.

Konzolos (parancssori ablakos) megjelenítéshez használható modul. Lehet vele színeket beállítani, képernyőt törölni, adott pozícióra ugrani és kurzorbillentyűket kezelni.

A modul segítségével Linuxon és Windowson egyaránt készíthetsz színes, mozgó konzolos programokat. Lehetőség van a billentyűzet kezelésére is (pl. nyilak).

## 1. Telepítés és futtatás

A csomag letölthető innen: pyconio.zip. Az alábbi példákban azt feltételezzük, hogy a program elején be lett importálva a modul. Ha a programod a `main.py` fájlban írtad, akkor ha mellette helyezkedik el a modul (a `pyconio` mappa), az utasítás egyszerűen `import pyconio`. A telepített fájloknak ehhez így kell elhelyezkedniük:

    ├─ main.py
    ├─ pyconio
    │  ├─ keys.py
    │  ├─ colors.py
    │  └─ ...
    └─ colorama
       └─ ...

A PyConio modullal készült programok nem futtathatók az IDLE Shell ablakában. A megírt programot egy külön konzol ablakban kell elindítani. Windowson ez lehetséges a főprogram `.py` fájlra dupla kattintással, vagy parancssorban a nevének beírásával. Linuxon pedig legegyszerűbb a `python3 main.py` paranccsal elindítani a programot.

## 2. Kurzor pozicionálása a konzolon

    import pyconio

    pyconio.gotoxy(10, 0)
    print("hello")

A következő `print()` vagy `pyconio.write()` ott fogja megjeleníteni a szöveget.

## 3. Képernyő törlése

    pyconio.clrscr()

Ez a bal felső sarokba rakja a kurzort.

## 4. Háttér és karakterek színezése

Arra fontos figyelni, hogy a színbeállítások addig érvényben maradnak, amíg azokat egy másikkal nem írjuk felül. (Tehát ha egyszer beállítjuk a háttérszínt kékre, utána a programunk teljes kimenete kékkel fog megjelenni.)

    pyconio.textcolor(pyconio.LIGHTGREEN)
    pyconio.textbackground(pyconio.BLUE)
    print("Hello world!")

Lehetőség van arra is, hogy a színek kódját közvetlenül a formázni kívánt szöveg elé illesszük be.

    print("{}Hello {}world!".format(pyconio.textcolors[pyconio.RED], pyconio.textcolors[pyconio.GREEN]))

A színek listáját lásd a `pyconio/colors.py` fájlban.

## 5. Képernyőre írás és a flush() függvény

> ### Kis kitérő: Flushing

> Amikor valamilyen kimenetre írunk, legyen az a konzol vagy egy fájl, az egy költséges művelet, ezért érdemes optimalizálni. Egy általános gyakorlat, hogy a kiírandó adatokat egy ideiglenes tárolóban, pufferben tároljuk, majd valamilyen eseményre egyszerre írjuk ki a konzolra vagy a fájlunkba. Ezt a műveletet (a puffer kiürítését és kiírását) „flush”-olásnak hívjuk. Az ezt kiváltó esemény lehet a program befejeződése, újsor karakter kiírása, vagy egy `flush()` függvény meghívása.

Konzolra íráshoz a `write()` függvényt érdemes használni. Ez hasonlóan viselkedik, mint a `print()`. Azzal ellentétben viszont nem flush-olja a kimenetet, illetve nem illeszt be alapesetben sortörést a kiírás után. A képernyő kirajzolása után nekünk kell meghívnunk a `flush()` függvényt.

    for i in range(0, 10):
        pyconio.write('\t{}'.format(i))
    pyconio.flush()

## 6. Nyers billentyűkezelés

Játékokhoz, illetve pszeudo-grafikus programokhoz szükség lehet arra, hogy a felhasználó által lenyomott billentyűket azonnal érzékeljük. Ekkor általában nem is szeretnénk, hogy a lenyomott billentyűk megjelenjenek a konzolon. Az is lehet, hogy olyan billentyűk lenyomását szeretnénk detektálni, amiknek a szöveges bemenetkezelésnél speciális szerepük van (pl. backspace, nyilak).

Ehhez először a bemeneti módot nyersre kell állítani:

    pyconio.rawmode()

A `kbhit()` függvénnyel tudjuk vizsgálni, hogy egy billentyű le lett-e nyomva.

    if pyconio.kbhit():
        # lenyomott billentyű vizsgálata

A lenyomott billentyűt a `getch()` függvénnyel lehet beolvasni. Ha előtte nem lett billentyű lenyomva, ez addig vár, amig nem érkezik egy lenyomás:

    key = pyconio.getch()

A modulban a speciális billentyűkre előre definiált azonosítók vannak (megtalálhatók a `pyconio/keys.py` fájlban). Ezekkel könnyen lehet a lenyomásokat detektálni.

    if key == pyconio.UP:  # ha a felfelé nyilat nyomta a felhasználó

A nyers módból a `normalmode()` függvénnyel tudunk kilépni. Ezután újra használhatjuk például az `input()` függvényt szöveges bemenet kezelésére.

    pyconio.normalmode()
    nev = input('Mi a neved?')

A nyers mód kezelését `with` utasításba is ágyazhatjuk, így automatikusan vissza fog állni normál módba a bemenet kezelése a blokk lefutása után.

    with pyconio.rawkeys():
        while True:
            # játékos iranyítása
            # ...
            if key == pyconio.ESCAPE:
                break

    nev = input('A ranglistára kerüléshez írd be a neved:')

## 7. Ablak címének beállítása

    pyconio.settitle('Ez fog a címsorban megjelenni')