Ťahák príkazov – tkinter

Veľmi dôležité! Python je CASE-SENSITIVE! Je rozdiel medzi veľkými a malými písmenami (napr. b a B).

Texty vždy píšeme v úvodzovkách. Buď „text“ alebo ‘text’ → nikdy nie kombinácia dvojitá text jednoitá úvodzovka, musia byť rovnaké.

Obsah:

  1. Načítanie grafiky
  2. Základné grafické príkazy na kreslenie
  3. Ako môžeme zadávať súradnice
  4. Premenné (lokálne, globálne)
  5. Náhoda (modul random)
  6. For cyklus
  7. Jednoduchý časovač do for cykla
  8. Komentovanie
  9. Získavanie vstupu od používateľa v Shelli
  10. Vypísanie textu do Shellu
  11. Pretypovanie premennej
  12. Podprogramy/Funkcie/Procedúry
  13. Podmienky (if)
  14. Udalosti myši
  15. Udalosti klávesnice
  16. Pravý časovač používaný vo funkciách
  17. Posúvanie objektov canvasu (klávesom, časovačom)
  18. Entry a tlačidlo
  19. Cyklus s podmienkou – While
  20. Jednorozmerné polia
  21. Dvojrozmerné polia
  22. Práca s obrázkami – png a gif
  23. Problémy s obrázkami
  24. Try-except
  25. Textové súbory – zapisovanie a dopisovanie
  26. Textové súbory – čítanie
  27. Ťahák na turtle grafiku (modul turtle)

1. Načítanie grafiky:

import tkinter 
c = tkinter.Canvas() 
# alebo c = tkinter.Canvas(bg='white', width=1000, height=600) #bg je farba pozadia, šírka, výška
c.pack()
ako je to s grafickým plátnom (plochou)

2. Základné grafické príkazy na kreslenie:

 c.create_line(x1,y1,x2,y2,x3,y3,...)
 nakreslí čiaru idúcu z bodu so súradnicami [x1,y1], do bodu [x2,y2], ďalej do bodu [x3,y3], prípadne ďalej do ďalších bodov
 c.create_line(x1,y1,x2,y2,width=5,fill='red')
 toto nastaví hrúbku čiary na 5 a jej farbu na červenú. Okrem základných môžete použiť aj nasledujúce farby: ‘orange’, ‘fuchsia’, ‘olive’, ‘skyblue’, a pod.
 c.create_rectangle(x1,y1,x2,y2)
# fill='red', outline='red'
 nakreslí obdĺžnik/štvorec, ktorý bude mať ľavý horný roh v bode so súradnicami [x1,y1] a pravý dolný roh v bode so súradnicami [x2,y2]
outline – zafarbí orámovanie útvaru
 c.create_rectangle(x1,y1,x2,y2,outline='blue')
# fill='red', outline='red'
 outline nastaví farbu čiary na modrú
 c.create_oval(x1,y1,x2,y2)
# fill='red', outline='red'
 nakreslí elipsu/kružnicu, ktorá bude vpísaná do obdĺžnika (preto vieme určiť x1,y1,x2,y2) s ľavým horným rohom v bode so súradnicami [x1,y1] a pravým dolným rohom v bode so súradnicami [x2,y2]
 c.create_polygon(x1,y1,x2,y2,x3,y3)
# fill='red', outline='red'
 nakreslí polygón, ktorý môže byť aj vyfarbený (napríklad na kreslenie trojuholníka, 5,6,7,8,9-uholníka… vždy treba zadať pre každý bod aj x aj y)
 c.create_text(x,y,text='toto sa vypíše',
font='Arial 70 bold',angle=90)
# fill='red'
 vypíše text „toto sa vypíše“ na súradnici x,y (x,y sú presné súradnice stredu textu), parameter „font“ môže, no nemusí byť zadaný, parametrom „angle“ otočíme napísaný text o príslušný uhol (tiež to nie je povinný parameter)
 c.delete("all")
zmazanie grafickej plochy (používa sa často práve vtedy, ak robíme s c.after(100) – c.update() )

3. Ako môžeme zadávať súradnice:

Ako môžete pracovať so súradnicami
1. Ako súradnice si určíme ľavý horný (x1,y1) a pravý dolný roh (x2, y2)
    c.create_rectangle(x1,y1,x2,y2)
2. Ako súradnice si určíme ľavý dolný roh (x1, y1) a pravý horný roh (x2, y2)
    c.create_rectangle(x1,y1,x2,y2)
3. Na začiatku si určíme súradnice stredu štvorca x,y a polomer (polovicu strany štvorca).
   Potom vykresľujeme tak, že zdáme ľavý horný roh, ktorý bude mať súradnice (x-v, y-v)
   a pravý dolný roh, ktorý bude mať súradnice (x+v, y+v)
     x = 200 (napr.)
     y = 200 (napr.)
     v = 50 (napr.)
     c.create_rectangle(x-v,y-v,x+v,y+v)

4. Premenné:

Lokálne premenné:

nazovpremennej = hodnota      #priradenie

Zvyšovanie hodnoty premennej o hodnotu napr. 10; číselné premenné integer: 
a = 32
a = a + 10         #aká bude teraz hodnota premennej? a=32+10 → a bude mať hodnotu 42

Znižovanie hodnoty premennej o hodnotu napr. 10:
a = 32
a = a - 10         #aká bude teraz hodnota premennej? a=32-10 → a bude mať hodnotu 22

Textové premenné - string:
a = "slovo"

Premenná s farbou:
farba = "blue"

Premenná s logickou hodnotou True/False:
logika = True

Globálne premenné:

a = 10
b = "Ahoj"

def nazovfunkcie():
    global a
    global b
    # alebo spolu zapísať:  global a, b
    # dalsie prikazy....

# premenné a b môžu byť definované aj tu
nazovfunkcie()

5. Náhoda:

Načítanie náhodných čísiel – 2 spôsoby:

1.spôsob:

from random import *

a = randrange(10, 20) #nepíšeme random.randrange, ale iba príkaz bez toho, aj pri ostatných typoch
b = randint(10,20)

# príkazy fungujú rovnako v oboch prípadoch ale vždy si musíme vybrať, ktorý spôsob použijeme

2.spôsob: 

import random  - vždy pred použitím musíme importovať knižnicu na náhodu 
a = random.randrange(10)  - môže mať 1 alebo 2 vstupy - toto vypľuje náhodné číslo v rozmedzí 0-9 - random.randrange(10,20) - toto vypľuje náhodné číslo v rozmedzí 10-19 
b = ramdom.randint(10,20) - musí mať 2 vstupy - toto vypľuje náhodné číslo v rozmedzí 10-20 
farba = random.choice(('red', 'green', 'blue', 'black')) - náhodná farba - vyberie si zo 4 možností - dá sa aplikovať aj na niečo iné, náhoda si vyberie jedno z uvedených možností oddelených čiarkou
cislo = random.choice([1, 2, 5, 10, 20, 50])   - vyberie si rôzne náhodné čísla
pismeno = random.choice(["K", "I", "s", "u", "I", "á"]) - vyberie si rôzne náhodné písmená/znaky
Náhodné farby z celej palety:
def rgb(r, g, b):
  return '#{:02x}{:02x}{:02x}'.format(r, g, b)
farba = rgb(random.randrange(256),random.randrange(256),random.randrange(256))
#pozor, toto je keď máme import random. ak máme from import random *, potom nedávame len random.randrange() ale iba randrange()

6. For cyklus:

Ako zapisujeme FOR cyklus v pythone? Je na to viac rôznych spôsobov:

for i in range(10): #čísla od 0 do 9
    print(i)

for i in range(5,10): #čísla od 5 do 9 
    print(i, end=' ')

for i in premenna: #v premennaej musí myť string napr. premenna = "Ahoj"
    print(i)

for i in 1,2,3:
    print(i)

for i in 2,3,5,11: 
    print(i**2) 

for i in range(2,100,2): #čísla od 2 do 99 ale iba párne
    print(i, end=' ')

for i in "AHOJ":
    print(i, end=' ') 

for i in "a","b","c","d":
    print(i)

- veľmi dôležité: príkazy, ktoré sa majú vykonať v rámci for cyklu, musia byť ďalej od okraja
- oddelenie od okraja buď automaticky, ak je správne zapísaná hlavička for cyklu
- na stlačenie TAB (tabulátora)
- alebo na 4 údery medzerníkom

7. Jednoduchý časovač do for cykla:

Postupné vykresľovanie objektov – jednoduchý časovač – používaný vo for cykle:

c.after(1000)           #v zátvorke je počet milisekúnd
c.update()

8. Komentovanie:

# - znak na zakomentovanie
## - alebo dva heštegy

SK klávesnica:
ALT - SHIFT (oba ľavé) - 3 (hore, tam kde sú písmená s diakritikou)

Anglická klávesnica:
SHIFT (ľavý) - 3 (hore, tam kde sú písmená s diakritikou)

Pre obe klávesnice:
- ak označím celý blok textu a potom stlačím zakomentovávanie, tak mi zakomentuje celú časť naraz dvoma ##
- ak označíte zakomentovaný text a stlačíte namiesto 3 číslo 4 (hore), tak vám odkomentuje celý blok kódu

9. Získavanie vstupu od používateľa v Shelli:

vstup = input("Zadaj text: ")      #ak pýtame texty - stringy
vstup = int(input("Zadaj číslo: "))  #ak vieme, že chceme od používateľ celé číslo
#vstup si treba uložiť do nejakej premennej

10. Vypísanie textu do Shellu:

print("Ahoj")      #vypísanie textu do Shellu - stringov
print(str(135))    #vypísanie čísla do Shellu (musíme pretypovať z čísla na string)
print(textovapremenna)   #môžeme vypísať aj text, ktorý máme v premennej
print(str(ciselnapremenna))   #ak chceme vypísať číslo, ktoré je v premennej

11. Pretypovanie premennej:

int(textovapremenna)     #pretypovanie textovej premennej na číslo, iba ak tam máme uložené texty, ktoré sú vlastne čísla v úvodzovkách "1" → 1
str(ciselnapremenna)     #pretypovanie celočíslenej premennej na text 1 → "1"

12. Podprogramy/Funkcie/Procedúry:

#bez parametrov
def nazov():
    # prikazy

nazov()

#s parametrami, môže tam byť jeden aj viac)
def nazov(parameter1, parameter2, parameter3):
    # prikazy

nazov(hodnota1, hodnota2, hodnota3)

#funkcie s návratovou hodnotou
def navratovaNazov():
     #prikazy
     return vysledok

ulozeniedopremennej = navratovaNazov()

13. Podmienky:

 if podmienka:
    prikazy
 else:
    prikazy

#zložitejšia podmienka

if podmienka:
    prikazy
elif inapodmienka:
    prikazy
else:
    prikazy

#podmienka v matematickom zápise: <, >, <=, >=, == (rovná sa), != (nerovná sa), not (zápor)
#dve podmienky spojené: and (a zároveň), or (alebo)
Príklad podmienky:
if pocet == 12:
    #prikazy

Alebo zložená podmienka:
if pocet == 12 and den = "pondelok":
    #prikazy

Napr.:
if 100 > body >= 90:
    print('za', body, 'bodov získavaš jednotku')
elif body >= 80:
    print('za', body, 'bodov získavaš dvojku')
else:
    print('rachol si')

14. Udalosti myši:

základné udalosti myši
def nazovfunkcie(event):  #okrem eventu si nevieme posielat ziadne ine parametre
    x = event.x #uloženie miesta kliknutia, to kde máme kurzor, x-ová súradnica kliku
    y = event.y #uloženie miesta kliknutia, to kde máme kurzor, y-ová súradnica kliku
    prikazy

c.bind("<Button-1>", nazovfunkcie)

# 1 - ľavé, 2 - stredné, 3 - pravé tlačidlo
# "<Button-1>" - klikanie (ľavým tlačidlom)
# "<B1-Motion>" - ťahanie (zakliknutého ľavého tlačidla)
# "<ButtonRelease-1>" - pustenie ľavého tlačidla
# "<Double-Button-1>" - dvojklik ľavým tlačidlom myši
# "<Triple-Button-1>" - trojklik ľavým tlačidlom myši
# ďalšie nájdeš tu

15. Udalosti klávesnice:

def nazovfunkcie(event):  #okrem eventu si nevieme posielat ziadne ine parametre
    prikazy

c.bind_all("<a>", nazovfunkcie)     # "A" kláves na klávesnici

def vypis(event):
    x = randrange(300)
    y = randrange(300)
    c.create_text(x,y,text=event.keysym)  #vypíše to, na ktorý kláves sme klikli

c.bind_all('<Key>', vypis)   # hociktorý kláves na klávesnici


Príklady tlačidiel:
'<a>' '<Left>' '<Right>' '<Up>' '<Down>'
'<Return>' '<space>'

16. Pravý časovač používaný vo funkciách:

Nekonečný časovač, ale len do chvíle, kým ho nestopneme podmienkou – zložitejší časovač – používaný vo funkciách:

def nazovfunkcie(): #tieto zatvorky musia byt prazdne
    prikazy
    #pripadne aj podmienka, kedy má iba fungovať časovač
    c.after(100, nazovfunkcie)           #v zátvorke je počet milisekúnd a funkcia, v ktorej sa nachádza, update tam môže a nemusí byť

nazovfunkcie()

17. Posúvanie objektov canvasu:

c.move('značka_objektu', posunx, posuny)  #značka - je tag

a) klávesom:

x = 0
y = 0
c.create_oval(x, y, x+10, y+10, fill='red',tags='nazov')

def vlavo(event):
     global x, y
     c.move('nazov',10,0) #posun o počet krokov doprava/doľava, posun o počet krokov hore/hole
     x = x + 10

c.bind_all("<Left>", vlavo)

b) v časovači:

x = 0
y = 0
c.create_oval(x, y, x+10, y+10, fill='red',tags='nazov')

def padadole():
     global x, y
     c.move('nazov',0,10) #posun o počet krokov doprava/doľava, posun o počet krokov hore/hole
     y = y + 10
     c.after(100, padadole)

padadole()

18. Entry a tlačidlo:

def button1_klik(): #funkcia, ktorá sa viaže ku tlačidlu
    prikazy
    hodnota = entry1.get() #získanie hodnoty z entryboxu

#button, tlačidlo na ploche - musíte udať oba riadky!:
button1 = tkinter.Button(text='text na buttone', command=button1_klik) #čo bude na tlačidle napísané a s ktorou funkciou je prepojené
button1.pack() #zmena umiestnenia button1.pack(side = "bottom") -> strany: left, right, bottom, top

#vstupné pole/entry box na ploche, povinné sú iba prvé dva riadky:
entry1 = tkinter.Entry() #vytvorenie entryboxu
entry1.pack() #zmena umiestnenia: entry1.pack(side = 'left')
entry1.insert(0,'text') #toto je poznámka, ktorá sa bude zobrazovať v entryboxe, nepovinný príkaz, vôbec tam nemusí byť

19. Cyklus s podmienkou – WHILE

while podmienka:              # opakuj príkazy, kým platí podmienka
    prikaz
    prikaz
    ...

while podmienka:
    prikaz
    prikaz
    ...
else:
    prikaz # vetva else je nepovinná!


#nekonečný cyklus, ktorý ale môže spadnúť:
while True:
    prikazy

20. Jednorozmerné polia (zoznamy, list):

ukážka
#1. vytvorenie prázdneho pola
prazdnepole = []
print(prazdnepole)

#inak vytvorenie prazdneho pola:
p = list()
print(p)

#2. vytvorenie hneď naplneného pola
polecisel = [5, 6, 7, 8] #pole čísel
print(polecisel)

poletextov = ["ahoj", "čau", "p"] #pole textov
print(poletextov)

zmiesanepole = ["ahoj", 5, "p", True, 36] #zmiešané pole
print(zmiesanepole)

#3. práca s polom - koľko prvkové pole budeme mať? aké budú mať hodnoty?
pole = []
for i in range(5):
    pole.append(randint(1,10)) #náhodné číslo do pola, alebo rovno môžete pridať hodnotu
print(pole)

#vieme pristupovať k jednotlivým prvom:
print(pole[3]) #viete i vypísať hodnotu na danom mieste
pole[3] = -19 #viete zmeniť hodnotu na danom mieste

21. Dvojrozmerné polia:

ukážky dvojrozmerných polí – rovnaká veľkosť, rôzna veľkosť

Vytvorenie dvojrozmerného poľa:

#1.spôsob
dvojpole = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(dvojpole)

#2.spôsob
riadok1 = [1, 2, 3]
riadok2 = [4, 5, 6]
riadok3 = [7, 8, 9]
polko = [riadok1, riadok2, riadok3]
print(polko)

#3.spôsob
pole = []
for i in range(3):
    pole.append([0, 0, 0])
print(pole)

#4.spôsob
dvojrozmerne = []
for riadok in range(3):   #namiesto 3ky môže byť radšej premenná pocetriadkov
    pom = []
    for stlpec in range(3): #namiesto 3ky môže byť radšej premenná pocetstlpcov
        pom.append(0)
    dvojrozmerne.append(pom)
print(dvojrozmerne)

#5.spôsob
p = []
riadkov = 3
stlpcov = 3
for i in range(riadkov):
    p.append([0] * stlpcov)
print(p)

Ako čítať konkrétne miesto v poli:

->>> prepokladám, že mám vytvorené dvojrozmené pole p
for i in range(riadok):
   for j in range(stlpce):
       print(p[i][j])

->> ak neviem počet stĺpcov a riadkov v poli p, musím to robiť takto:
 for i in range(len(p)):
     for j in range(len(p[i])):
         print(p[i][j])

#Dôležité! Ak chceme pristupovať ku konkrétnej hodnote v poli, robíme to: 
p[riadok][stlpec] #Pri jednorozmernom poli nám stačilo urobiť p[index]
->> prípadne to môžem urobiť aj takto:
 for prvokriadku in p:
     for prvokstlpca in prvokriadku:
         print(prvokstlpca)

#tu už hneď získame prvok

22. Práca s obrázkami – png a gif:

obrazok1 = tkinter.PhotoImage(file = 'zajac.png') #obrázok musí byť uložený v tomto istom priečinku ako python súbor!!!!
#vykreslenie obrázka - x,y je v strede obrázka:
c.create_image(100, 100, image = obrazok1, tag="zajko") #tag nemusí byť

#zistenie rozmerov obrázka
sirka = obrazok1.width()
vyska = obrazok1.height()

#Pole obrazkov:
obrazky = [] 

def nacitaj(nazov, typ, pocet, obrazky): 
    for i in range(1, pocet+1): 
         obrazok = tkinter.PhotoImage(file = nazov + str(i) + '.'+typ) 
         obrazky.append(obrazok) 

def nakresli(x,y,obrazky): 
    for obrazok in obrazky: 
         c.create_image(x, y, image = obrazok, anchor = 'nw') 
         x += 100

nacitaj('obr_', 'png', 4, obrazky) 
nakresli(10, 30, obrazky)

Obrázkové pozadie:

import tkinter
c = tkinter.Canvas()
c.pack()

pozadie = tkinter.PhotoImage(file = 'dlazba1.png')
sirka = pozadie.width()
vyska = pozadie.height()
c.create_image(0, 0, image = pozadie, anchor = "nw") #zmena vykreslovania obrázka, teraz ho kreslíme z ľavého horného rohu, tam sa nachádza jeho x,y
c['width'] = sirka
c['height'] = vyska

23. Problémy s obrázkami

Čo ak mi píše, že nevie nájsť obrázky? Prípadne sú obrázky v inom priečinku?

import os
cestaKPriecinku = os.path.dirname(__file__)
cestaKSuboru = os.path.join(cestaKPriecinku, "images/trava.png")
pozadie = tkinter.PhotoImage(file= cestaKSuboru)
c.create_image(0,0, image = pozadie, anchor="nw")

24. Try-except

Je to formulka, pomocou ktorej viete odchytávať errory a upozorňovať na ne používateľa.

try:
  print(x)
except NameError:  #dá sa zapísať aj viac výnimiek naraz except (ValueError, IndexError):
  print("Premenná x nie je definovaná")
except:
  print("Iná chyba, niečo je zle")

Bežné typy errorov: ValueError, NameError, IndexError, TypeError, ZeroDivisionError

25. Textové súbory – zápis a dopisovanie

  • Prázdny súbor môžete alebo nemusíte mať vytvorený.
  • Súbor musíme vždy otvoriť a zavrieť! Vždy keď urobíte open, musíte si zapísať aj close.
  • Súbor sa vždy prepisuje „w“.
  • Zapisovanie pomocou príkazu write vždy píše do jedného riadku, ak chcete, aby ďalšie slovo/vetu písalo na nový riadok, treba pridať \n
  • Zapisovanie pomocou príkazu print, môžete pridať aj end, sem viete pridať oddeľovač, napr medzeru, alebo nový riadok, čiarku, hviezdičku, …. a treba napísať že do ktorého filu (súboru) zapisujete.
  • Ak chcete pokračovať v zápisoch, nahraďte „w“ pímenom „a“ – znamená append, pridáva na koniec súboru.
  • Pri práca si súbormi, majte vždy zavretý .txt súbor!!!!!!!!!!!!!!!!!! Nenechajte si ho otvorený!!!!!!!!!!!!
subor = open('zapis.txt', 'w') #w - prepisovanie súboru, vieme nahradiť aj inými písmenami "a", zapisovanie na koniec, "r" len čítanie
subor.write("Čauko kakuko")
subor.close()

subor = open('zapis.txt', 'w')
subor.write("Čauko kakuko\n")
subor.write("Halo hahaha")
subor.close()

subor = open('zapis.txt', 'w') #keby máme namiesto "w" písmeno "a", tak by nám dopisovalo do súboru, nechalo by tam aj to pôvodné, čo tam bolo
for i in range(10):
   print(randint(1, 100), end=' ', file=subor)
subor.close()

26. Textové súbory – čítanie zo súboru

  • Pri čítaní zo súboru, musí už súbor existovať!!!!!
  • Súbor musíme vždy na začiatku otvoriť a zavrieť!
  • Ak chceme čítať súbor, musíme napísať, že ideme čítať zo súboru „r“.
  • Celý súbor vieme prečítať naraz pomocou príkazu read.
  • Obsah si môžeme uložiť do premennej alebo ho rovno vypísať napr. do shellu, zapísať do iného súboru, napísať na canvas…
  • Ak chceme prečítať súbor po riadkoch, tak čítame pomocou readline() ->>.> pozor na čítanie iba pomocou readline, pozrite sa ako to vypísalo a ako to vyzerá v skutočnosti v súbore!
  • Pomocou príkazu repr(riadok) viete zistiť, aké skryté znaky sa nachádzajú v texte.
  • Všimli ste si, že sa nám vypisujú aj tie skryté znaky, vieme ich odstrániť pomocou príkazu riadok. strip(). Odporúčam mať to ale aj v tom repr. Tak si zabezpečíte, že vám krásne prečíta celý riadok.
  • Funkcia strip() nám vie odstrániť medzery aj skryté znaky (koniec riadka) z textu. Ale čo ak to tak nechcem? Čo ak chcem vymazať len znak konca riadka? Vieme použiť rstrip() – odstráni medzery a znak konca riadka sprava, lstrip() odtráni medzery a iné skryté znaky zo začiatku riadka.
  • Ak náhodou máme diakritiku a škaredo to zobrazuje, treba čítať takýmto spôsobom: subor = open(meno_suboru, encoding=’utf-8′)
subor = open('citaj.txt', 'r')
print(subor.read())
subor.close()

subor = open('citaj.txt', 'r')
for i in range(0,5):
    riadok = subor.readline()
    print(riadok)
subor.close()

subor = open('citaj.txt', 'r')
for i in range(0,5):
    riadok = subor.readline()
    print(repr(riadok))
subor.close()

subor = open('citaj.txt', 'r')
for i in range(0,5):
    riadok = subor.readline()
    print(repr(riadok.strip()))
subor.close()

#Ak neviem počet riadkov súboru, tak takto:
subor = open('citaj.txt', 'r')
riadok = subor.readline()
while riadok != '':
   print(repr(riadok.strip()))
   riadok = subor.readline()
subor.close()

#alebo toto - ja preferujem tento spôsob:
subor = open("data.txt", "r")
for riadok in subor:
    print(riadok.strip())
subor.close()

Práca s textovými reťazcami

Tuple / n-tice

Asociatívne polia

Vylepšenia do tkinter okna

Iné Python ťaháky:

  1. gjh ťahák
  2. programujeme v Pythone 1.diel ťahák
  3. programujeme v Pythone 2.diel ťahák
Facebook komentáre