Gráf rajzoló és elemző grafikus alkalmazás

Az előző bejegyzésekben gráfok reprezentációjával és az alapvető gráfalgoritmusokkal (szélességi és mélységi bejárás, legrövidebb út) foglalkoztunk. Ennek során a csúcsokat képviselő Vertex osztály mellett kifejlesztettük a gráfot modellező Graph osztályt. E két osztályt mint gráfmodellt fogjuk használni a továbbiakban, és ehhez ezeket egy graph_model nevű modulba helyezzük. E modul tartalma tehát ez:

Most e modellhez egy grafikus felhasználói interfészt (GUI) biztosító osztályt hozunk létre, amelyek együtt olyan alkalmazást adnak, amellyel gráfokat tudunk rajzolni és az alapvető algoritmusokat tudjuk a megrajzolt gráfon működtetni.

A GUI kivitelezését a tkinter modul segítségével valósítjuk meg, és alap kinézetét a következő kép mutatja.

A grafikus felület egy főablakból áll, ami három részre tagolódik, amelyeket egy-egy keret elem (Frame widget) határoz meg. A felső keretben helyezkednek el azok a nyomógombok, amelyekkel valamilyen hatást akarunk elérni a bal oldali keretben megrajzolt gráfra vonatkozóan. A Törlés nyomógombbal lehet törölni az eddig rajzolt gráfot és egy újat kezdeni. A további gombokkal az ablak jobb oldali keretében meg lehet jeleníteni a szomszédsági kapcsolatokat, valamint a csúcsok sorrendjét szélességi vagy mélységi bejárás esetén. A bejárás kiinduló csúcsát a beviteli mezőben lehet megadni.

A csúcsok felvételét a Ctrl + bal egérgombbal lehet megtenni. A megjelelő csúcsok címkéi automatikusan képződnek nemnegatív egész számok sorozatának formájában.

A csúcsokat összekötő élek lehetnek nem irányítottak és irányítottak. Nem irányított élt úgy tudunk létrehozni, ha a két csúcsra a jobb egérgombbal kattintunk. Az összekötő vonal a második csúcsra való kattintás után kirajzolódik. Irányított élt hasonló módon hozhatunk létre, de ilyenkor Ctrl+jobb egérgombbal kell kattintani.

Az éleket törölni is lehet. Ehhez a törlendő élt először ki kell jelölni. Ezt a bal egérgombbal duplán kattintva tehetjük meg. A kijelölést az él színének megváltozása mutatja. A kijelölés után, a jobb egérgomb kattintás hatására törlődik az él.

A grafikus megjelenítést végző osztályt egy graph_visualizer_gui_application.py nevű modulban definiáljuk, amely egyben a főmodul is, vagyis ezt kell majd futtatni, és ez használja a korábban említett graph_model modult.

A graph_visualizer_gui_application.py modul, illetve a benne definiált GraphApp osztály kódját a követhetőség könnyítése érdekében részletekben mutatjuk az alábbiakban. A működés megértését a részletes kommentek segítik.

Elsőként az __init__ tartalmát mutatjuk, ahol a gráfmodell egy példányát és a szükséges grafikus elemeket hozzuk létre. Szintén itt hozzuk létre a csúcsok numerikus címkéihez a számsorozatot előállító generátort.

A következő kódsorokban az __init__-ben meghívott két azon metódus definícióját láthatjuk, amelyek a grafikus elemek lehelyezését és az események és eseménykezelők hozzárendelését végzik.

Az alábbi kódrészletben a fent említett nyomógombok által meghívott metódusok definíciói vannak felsorolva.

A a csúcsok lehelyezését és összekötését megvalósító metódusok kódjai a következők:

És végül, az él törlését, illetve a törlés előtti kijelölést lehetővé tevő metódusok láthatók alább, valamint az osztály példányosítása és a grafikus alkalmazás indítása.

A kódrészletek után a teszteléshez és használathoz alább láthatjuk a graph_visualizer_gui_application modul teljes tartalmát:

A teljes programkód ezen github linken is megtekinthető és letölthető: https://github.com/pythontudasepites/graph_visualizer

A következő ábrán egy példafuttatás eredményének képernyőképei láthatók. A bal oldali keretben megrajzolt gráfhoz a jobb oldalon kiírattuk a szomszédsági viszonyokat, valamint a szélességi és mélységi bejárást a 0 jelű csúcstól. A mélységi bejárást egy másik csúcstól kezdve is lekértük.

A gráfmodellben látható, hogy az képes legrövidebb utat számolni, vagy akár csúcsot törölni, hiszen ezeket fejlesztettük ki a korábbi bejegyzések során. A GUI mégsem biztosít ezekhez felületet. Ez szándékos. Mégpedig azért, hogy a meglévő kódok kiegészítésével vagy módosításával gyakorolni lehessen a grafikus interfész fejlesztését úgy, hogy van már egy megjelenítésre képes, használható alap.

A továbbfejlesztésre számtalan lehetőség van. Az előbb említetteken felül például lehessen a csúcsoknak tetszőleges címkét adni, vagy az élekhez súlyt rendelni, és a kezdőcsúcs mellett egy végcsúcsot is megadni, ami feltétel ahhoz, hogy a legrövidebb út algoritmust érdemben lehessen használni; vagy lehessen a gráfot elmenteni és betölteni. Természetesen a modell is bővíthető úgy, hogy további algoritmusok kezelésére vagy műveletek végzésére legyen képes. Nyilván ilyekor a grafikus interfészt is bővíteni kell.

E bejegyzés témájához a Python tudásépítés lépésről lépésre című e-könyv következő részei kapcsolódnak elsősorban: a „Grafikus felhasználói felület készítése” fejezet, illetve ebben a „A grafikus elemek fajtái, létrehozásuk és konfigurálásuk” alfejezet. Ezen belül pedig különösen a „Vászon” alcím

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.