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).
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.
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.
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()
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:')