19 Tarkvaraprototüübi näiteprogrammid
Tarkvaraarenduse kursuse ja ka õpiku saab tinglikult jaotada kaheks – klassikalised programmeerimise teemad ja tarkvaraarendus. Tarkvaraarenduse n-ö tööstuslikku vaadet käsitleme järgmises osas, siin aga on toodud näiteprogrammid, mis võivad aidata oma programme luua. Programmeerimise kursuste üks loomingulisemaid osi on kahtlemata ise ja omal teemal programmi koostamine. Kuna kursuse maht on väike, siis päris suurt tarkvara arendada ei jõua. Nimetagemgi siis loodavat programmi tarkvaraprototüübiks – kõik ei pruugi veel täies mahus toimida, aga aimu võimalikust lõpptulemusest juba saab.
Kursuse raames ja IT-tööstuses tarkvara loomise protsesside sarnasused ja erinevused on väga huvitav temaatika. Mis teil endal tööstusliku tarkvaraarendusega võrreldes sarnaselt või erinevalt läheb?
Näiteprogrammid Githubis
Githubi repositooriumis on toodud mõned terviklikud näiteprogrammid, mida võib kasutada nii ideeliseks inspiratsiooniks kui ka otseste koodinäidetena, mille komponente saab enda programmis kasutada. Programmide ehitus ning nende töö etapid on kirjeldatud repositooriumi README-failis.
Lühikesi koodinäiteid
Siin on toodud lühikesed näitekoodid, millest võib olla abi terviklike näiteprogrammide mõistmisel.
CSV-faili lugemine järjendisse
Ilma päiseta (veergude nimedeta)
Avame CSV-faili nimega minufail.csv, kus igal real on semikoolonitega (sümbol “;”) eraldatud väärtused. Igast reast moodustub järjend, neid järjendeid hoiustame järjendis andmed.
import csv
failinimi = "minufail.csv"
csv_fail = open(failinimi, encoding="UTF8") # Avame faili
csv_reader = csv.reader(csv_fail, delimiter = ";") # Anname selle CSV lugejale, semikoolonit loeme eraldusmärgiks
andmed = [] # Siia järjendisse kogume ridade järjendid ("andmed" on kahemõõtmeline järjend)
for rida in csv_reader: # muutuja "rida" on järjend ühelt realt loetud väärtustest
andmed.append(rida)
csv_fail.close()
Koos päisega (veergude nimedega)
Kui CSV-faili esimesel real on veergude pealkirjad, siis tuleb need kuidagi ülejäänud andmetest eraldada. Üks viisidest on järgmine:
import csv
failinimi = "minufail.csv"
csv_fail = open(failinimi, encoding="UTF8") # Avame faili
csv_reader = csv.reader(csv_fail, delimiter = ";") # Anname faili CSV lugejale, semikoolon eraldab väärtusi
ridade_loendur = 0
andmed = []
for rida in csv_reader: # CSV lugeja teeb igast reast järjendi
if ridade_loendur == 0: # Esimesel real on veergude nimed, hoiustame need eraldi
print("veergude nimed:"+str(rida))
veergude_nimed = rida
else: # Ülejäänud ridadel on andmed, hoiustame neid järjendis
print("rea sisu:"+str(rida))
andmed.append(rida)
ridade_loendur += 1
csv_fail.close()
Kahemõõtmelise järjendi läbimine
Kahemõõtmelise järjendi läbimiseks kasutame tavaliselt kahekordset tsüklit.
järjend = [[1,2,3],[4,5,6]]
for rida in järjend:
for väärtus in rida:
print(väärtus)
Tkinteri kasutamine
Tkinteri graafikamoodul võimaldab detailselt kontrollida programmi graafilist poolt. Meie näidetes kasutame elementide paigutamiseks komponenti frame ning käsku pack, kuid tegelikult saab Tkinteriga elemente paigutada ka rohkematel viisidel.
Tkinteri programmid käivituvad käsuga mainloop(). Tuleb arvestada, et pärast mainloop’i käivitamist Python edasiste ridadeni ei jõua, kuniks käivitatud juuraken alles on. Seetõttu on graafikaga programmi tööks vajalik kõik oluline käivitada sellest käsust eespool.
Elementide ilusaks paigutamiseks on tavaliselt vaja käsule pack() anda sobivad argumendid. Geomeetriahalduri pack juhendist võib olla abi sobivate argumentide leidmisel.
Akna loomine
Tkinter vajab algatuseks juurakna loomist ning selle eraldi käivitamist.
import tkinter as tk
root = tk.Tk() # Loome juurakna, millesse lisame hiljem muid graafikaelemente
root.title("Pealkiri") # Anname juuraknale pealkirja
####
# siia vahele käivad kõik tegevused, mida laseme graafikaliidesel teha
####
root.mainloop() # Käivitame graafika. Siit edasi programmiridu ei käivitu, kuniks juuraken on alles
Sildi (teksti) lisamine
Silt (ingl label) on element, millega kuvada teksti. Sildi sisu on võimalik tagantjärgi muuta.
import tkinter as tk
root = tk.Tk() # Loome juurakna, millesse lisame hiljem muid graafikaelemente
root.title("Pealkiri") # Anname juuraknale pealkirja
frame = tk.Frame(root) # Lisame juuraknale (nähtamatu) raamistiku, kuhu teisi elemente kinnitada
frame.pack(side=tk.TOP)
sildi_tekst = "Terekest."
silt = tk.Label(frame, text=sildi_tekst) # Loome sildi meie määratud tekstiga, seostame selle meie raamistikuga
silt.config(font=("Serif", 44)) # Muudame sildi fonti ning teksti suurust
silt.pack(fill=tk.BOTH) # Paigaldame sildi (silt muutub nähtavaks)
root.mainloop() # Käivitame graafika. Siit edasi programmiridu ei käivitu, kuniks juuraken on alles
Nupu lisamine
Nuppude lisamisel on vajalik nupule vajutamisel juhtuv tegevus defineerida eraldi funktsioonis.
import tkinter as tk
def nupu_tegevus(): # Nupuga seotud tegevus peab olema loodud eraldi funktsioonina
print("vajutatud")
root = tk.Tk() # Loome juurakna, millesse lisame hiljem muid graafikaelemente
root.title("Pealkiri") # Anname juuraknale pealkirja
frame = tk.Frame(root) # loome raamistiku, kuhu nuppe paigutada
frame.pack(side=tk.TOP)
button = tk.Button(frame,
text="Vajuta",
fg="black",
command=nupu_tegevus) # Loome nupu, mida vajutades käivitub funktsioon "nupu_tegevus"
button.pack(side=tk.BOTTOM, fill=tk.X, padx=10, pady=10) # paigutame nupu: alla serva (side=tk.BOTTOM), x-teljel täitvalt(fill=tk.x), 10-pikslise servavahega
root.mainloop() # Käivitame graafika. Siit edasi programmiridu ei käivitu, kuniks juuraken on alles