Hrvatska, ICT, Obrazovanje

Petak, 01.07.2011.

Tagovi: Python

  • 11:15

Even parity

Python u škole! (5/5)

Dok sam pisao ovaj mali serijal do mene je doprla informacija kako se neki nastavnici i profesori već igraju sa Pythonom i o njemu ozbiljno razmišljaju. Struka je, dakle, već zapazila ovaj programski jezik.

Piše: Radoslav Dejanović

Korak po korak, došli smo do kraja ove kratke i nadam se ne pretjerano komplicirane priče o programskom jeziku Python. Za kraj malo ćemo obraditi grafiku, što je i dobar primjer jedine ozbiljne neuralgične točke koju Python u svom trećem izdanju ima.

Nova inkarnacija Pythona, naime, nema toliko biblioteka koliko ih ima stara verzija. Riječ je o relativno novoj verziji sa nekim novim idejama, pa je biblioteke potrebno "preraditi" kako bi radile na novoj verziji jezika. U opticaju je ogromna količina softvera pisanog za Python 2, i obzirom da se dvojka još uvijek intenzivno koristi, autori modula ne žure prepraviti iste za novu verziju. Zbog toga je u ovom trenutku ponuda modula za novi Python nešto siromašnija, a dobavljanje modula nešto kompliciranije. Trend prilagođavanja modula je obećavajuć.

Zašto onda nisam pričao priču o Pythonu 2? Iz jednostavnog razloga: Python 3 je budućnost, i to ne tako daleka. Čak i ako nekim čudom Python uđe u školski kurikulum, to se neće dogoditi danas, već taman u vrijeme kad Python 3 bude "kompletiran".

No, za sada to znači da neke biblioteke uopće nisu dostupne, a neke morate ručno instalirati. Nije pretjerano komplicirano, ali valja imati malo znanja (obzirom da je tekst namijenjen nastavnicima informatike, usuditi ću se vjerovati kako oko toga neće biti problema).

Upoznajmo se sa fenomenalnim modulom nazvanim Pygame, bibliotekom koja daje skup jednostavnih funkcija za upravljanje grafikom, ali i izradu računalnih igara, što Pygame čini iznimno zanimljivom igračkom u informatičkoj učionici.

Za početak, obzirom da Pygame uglavnom ne dolazi sa Pythonom 3, trebate ga ručno instalirati. Korisnici Windowsa mogu ovdje pronaći instalacijske datoteke, dok su jednostavne upute za korisnike Ubuntu, Debian i sličnih distribucija navedene na kraju ovog linka, a korisnici Macintosha upute mogu pronaći ovdje.

Jednostavan, neinteraktivni demo postaviti ćemo ovako: napraviti ćemo prozor veličine 640x480, zatim ćemo u njemu izabrati slučajne X i Y koordinate, pa ćemo od te koordinate do ruba prozora crtati sinusoide u raznim bojama. Nakon izvornog koda slijede objašnjenja.

No, ono što ćete odmah uočiti jest drugačiji princip na kojem pygame radi: on uvodi događaje (evente) i tu se već ozbiljnije igramo sa objektno orjentiranim programiranjem, srećom na vrlo jednostavan i razumljiv način.

import pygame
import math, random

pygame.init()

ScreenX = 640
ScreenY = 480
run = 1

screen = pygame.display.set_mode ((ScreenX, ScreenY))


while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = 0

X = random.randint (1, ScreenX)
Y = random.randint (1, ScreenY)
Z= Y

ColorR = random.randint (1, 255)
ColorG = random.randint (1, 255)
ColorB = random.randint (1, 255)

while X < ScreenX:
pygame.draw.line(screen, (ColorR, ColorG, ColorB), (X,Z), (X,Y))
X+=2
Y+=math.sin(X)*20
pygame.time.wait(50)
print (X,Y)


pygame.display.update()



Odmah na početku importirali smo tri modula: Pygame će nam poslužiti za crtanje, u modulu math nalazi se funkcija za računanje sinusa, a modul random nam treba kako bismo dobili slučajne brojeve i tako naš zadačić učinili jednostavnijim.

Nakon toga inicijalizirali smo pygame. U varijable ScreenX i ScreenY stavili smo željenu veličinu prostora, a zatim smo varijabli run dali početnu vrijednost jedan (True), jer ćemo je kasnije koristiti za kontrolu programa.

Malo dalje, ništa kompliciranije: definirali smo grafički prozor veličine zadane gore navedenim varijablama i nazvali ga screen; to je objekt po kojemu ćemo kasnije crtati.

Ostatak priče izvršava se u glavnoj while petlji, sekvencijalno. Prvo ispitujemo jesmo li dobili event za izlazak iz aplikacije (klikom na gumb za zatvaranje prozora), pa ako jesmo, završavamo sa radom.

Zatim u koordinate X i Y stavljamo slučajni broj između jedinice i najveće dužine, odnosno širine ekrana; one će biti početne točke naše sinusoide. U varijable ColorR, ColorG i ColorB stavljamo slučajnu vrijednost 1-255; miješanjem te tri varijable dobiti ćemo boju sinusoide.

Druga while petlja izvršava se sve dok je varijabla X manja od desnog ruba prozora. Crtanje obavlja pygame.draw.line funkcija kojoj smo rekli po kojem objektu treba crtati (screen), tri RGB komponente boje kojom će crtati, početnu točku (X,Z) i krajnju točku (X,Y) crte.
X zatim uvećavamo za dva, a Y mijenjamo ovisno o sinusu X-a. Da stvar ne bi radila prebrzo, dodali smo 50ms kašnjenja naredbom pygame.time.wait(), a nakon toga u konzoli ispisujemo vrijednosti X i Y varijabli. Za kraj, da bismo uopće vidjeli promjenu, moramo pozvati pygame.display.update() koja će osvježiti prikaz.

Za domaću zadaću, dva malo kompliciranija zadatka: zašto se sinusoida koju crtamo ponaša neobično i kako to jednostavnom izmjenom ispraviti? Zatim, zašto je izlaz iz programa moguć tek kada je sinusoida došla do ruba ekrana, odnosno zašto se program ne ugasi čim kliknemo iksić na rubu prozora (i kako to optimizirati)?

Programiranje pomoću Pygame modula zaista je jednostavno, a doticaj sa objektnim programiranjem je skroman. Sa druge strane, iako je Pygame simpatičan modul za izradu igara ili 2D (pa i 3D) grafike, uključujući OpenGL... ipak je vjerojatnije kako će izrada grafičkog sučelja za aplikaciju biti češći posao. A za tu ćemo namjenu koristiti ipak prilagođeniju platformu: Qt biblioteku.

Kao i u slučaju prethodnog modula, morati ćemo ga posebno instalirati (što, kako smo već rekli, u slučaju stavljanja ovog jezika u školski kurikulum, tamo negdje 2028. godine, neće biti problem), Linuxaši prema uputama ovdje, Windowsaši preuzimanjem gotovog instalera ovdje, a Macintoshevci na fink-u.

Pregledom ovog, kao i u slučaju pygame primjera zapravo nevelikog komada koda, uočiti ćete kako je objektna orjentiranost značajno jače istaknuta od primjera za pygame:

import sys
from PyQt4 import QtGui, QtCore


class Prozor(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)

self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Dumb Gumb')

gumb = QtGui.QPushButton('Zatvori me!', self)
gumb.setGeometry(75, 75, 90, 35)

self.connect(gumb, QtCore.SIGNAL('clicked()'),
QtGui.qApp, QtCore.SLOT('quit()'))


app = QtGui.QApplication(sys.argv)
qb = Prozor()
qb.show()
sys.exit(app.exec_())


Krenimo redom: nakon importa odgovarajućih modula, prva stvar koju smo napravili je definicija prozora kao klase bez roditelja (on će, dakle, biti roditelj ostalim komponentama); zatim smo definirali veličinu prozora, kao i tekst u naslovu. Nakon toga smo definirali gumb nazvan "gumb", sa odgovarajućim tekstom i položajem unutar prozora. Nakon toga definirali smo što se događa u slučaju kada kliknemo taj gumb: kada dobijemo signal da je gumb pritisnut, pozivamo odgovarajući slot, u ovom slučaju quit(). Qt biblioteka omogućuje komunikaciju korištenjem signala i slotova, na relativno jednostavan način.
Po završetku definiranja klase Prozor, kreiramo aplikacijski objekt, prikazujemo naš prozor i u zadnjoj liniji pokrećemo glavnu programsku petlju koja će za nas odraditi rukovanje svim događajima.

Iako je primjer jednostavan, ne čini se prilagođenim mlađim uzrastima, kojima bi proceduralni pristup vjerojatno puno lakše sjeo. Kao što Python može prikriti svoju objektnu orjentiranost, tako ni Qt ne sili programera na pisanje isključivo objektnog koda, pa je istu stvar moguće napisati i proceduralno:


import sys
from PyQt4 import QtGui, QtCore

app = QtGui.QApplication(sys.argv)

Prozor = QtGui.QWidget()
Prozor.setGeometry(300,300,250, 150)
Prozor.setWindowTitle("Dumb Gumb")
Prozor.show()

Gumb = QtGui.QPushButton("Zatvori me!")
Gumb.setGeometry(75, 75, 80, 35)
Gumb.show()

Prozor.connect(Gumb, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))

sys.exit(app.exec_())


Ipak, ovakav način pisanja zgodan je samo za jednostavne primjere (kakvi se, uostalom, u osnovnoj školi i rade), a za ozbiljnije aplikacije objektni model je puno bolji izbor. To znači da školarci ne trebaju izbjegavati Qt biblioteku za izradu jednostavnih grafičkih sučelja napisanih proceduralnim stilom – dokle god je riječ o samo par elemenata sučelja i jednostavnim programima, nema razloga "forsirati" objektno orjentirano programiranje.

Ako ste pokrenuli proceduralni primjer, vjerojatno ste primjetili da sa njim nešto ne štima – kamo je pobjegao gumb? Za domaću zadaću, učinite jednostavnu izmjenu koda (u jednom retku, usporedite kod sa prethodnim) koja će gumb smjestiti tamo gdje mu je mjesto.

I ovdje bih ipak podvukao crtu. U ovih pet nastavaka prešli smo od najjednostavnijih stvari sve do (također ne pretjerano kompliciranih) programa koji koriste grafiku i GUI. Komplicirano zaista nije.
Dok sam pisao ovaj mali serijal do mene je doprla informacija kako se neki nastavnici i profesori već igraju sa Pythonom i o njemu ozbiljno razmišljaju. Struka je, dakle, već zapazila ovaj programski jezik.

Python u škole? Mislim da bi to bila pametna ideja. Zapravo, bilo kakav dobar i moderan programski jezik bio bi dobra zamjena za zastarjele metode koje i danas koristimo. Računala se razvijaju vrlo brzo, tako i koncepti i tehnologije. Ja sam gubio vrijeme na "crtanje" rupa na bušenoj kartici po EBCDIC kodiranju, pa recite što mi sad to školovanje vrijedi i tko više koristi bušene kartice? Što želimo u školama: BASIC ili nešto jednako jednostavno, a modernije i – živo?!?!

Uostalom, ako ne vjerujemo nama samima, možda nas uvjere strana iskustva?

Autor je jedan od vodećih domaćih informatičara i ekspert za slobodni softver, informatički novinar, bivši stručni savjetnik za informatiku u poglavarstvu Grada Zagreba i vlasnik tvrtke Operacijski sustavi. Jedan je od 25 najboljih IT konzultanata u Hrvatskoj, prema izboru korisnika tih usluga. Njegove tekstove možete pronaći na njegovom osobnom blogu oddparity.org.

Izvor: Monitor.hr