PyConio: konzolos megjelenítő modul

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

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