Interaktívne aplikácie v Tkinter umožňujú používateľovi komunikovať s objektmi na plátne pomocou myši a klávesnice. Naučíme sa pohybovať objektami, reagovať na kliknutia myšou a spracovávať vstup z klávesnice. Tieto techniky sú základom pre tvorbu jednoduchých hier a interaktívnych aplikácií.
Pre pohyb objektov tu používame metódy move() a coords(). Metóda move() posúva objekt o zadané hodnoty, zatiaľ čo coords() nastaví absolútne súradnice objektu.
move(objekt, dx, dy) - posunie objekt o dx, dy pixelov coords(objekt, x1, y1, x2, y2, ...) - nastaví nové súradnice objektu
itemconfig(objekt, parameter=hodnota) - zmení vlastnosti objektu tak, že mu nastaví novú hodnotu parametra
Program postupne vykonáva všetky príkazy v programe, robí to však rýchlo, ľudské oko nestihne zaznamenať zmeny, preto je potrebné pozdržať program (na niekoľko milisekúnd), a nanovo vykresliť obsah plátna. Na to slúži dvojica príkazov:
platno.after(milisekund)
platno.update()
Pomocou metódy .bind() na plátne (knižnica tkinter) vieme spracovať rôzne udalosti od myšky. Postupne obslúžime tri udalosti: kliknutie (zatlačenie tlačidla myši) t.j. <ButtonPress>', ťahanie (posúvanie myšou so zatlačeným tlačidlom alebo bez zatlačeného tlačidla) t.j. '<Motion>' a pustenie tlačidla myši t.j. '<ButtonRelease>'.
Po spustení programu sa zakaždým, keď užívateľ klikne na plátno vyvolá nejaká obslužná funkcia. V metóde .bind() je prvým parametrom názov udalosti a druhým parametrom určíme, ktorá funkcia sa má po danej udalosti vykonať. Pri definovaní obslužnej funkcie musíme vo funkcii stanoviť vždy jeden povinný parameter (napr. event), v ktorom sa uchovajú dôležité hodnoty pri udalosti (napríklad súradnice polohy myši event.x, event.y).
Program, v ktorom sa vykreslí na mieste kliknutia myšou krížik:
Pozn. klikať sa dá rôznymi tlačidlami myši (ľavé, stredné koliesko, pravé).
'<ButtonPress>' ... stlačenie ľubovoľného tlačidla myši'<Button-1>' ... stlačenie ľavého tlačidla myši'<Button-2>' ... stlačenie stredného tlačidla myši'<Button-3>' ... stlačenie pravého tlačidla myši'<Double-Button-1>' ... dvojklik ľavého tlačidla myši'<Double-Button-2>' ... dvojklik stredného kolieska myši'<Double-Button-3>' ... dvojklik pravého tlačidla myši
Pri ťahaní myšou so stlačeným niektorým tlačidlom, alebo aj pri ťahaní myšou bez tlačidla sa môže vyvolať nejaká obslužná funkcia.
Napríklad nižšie je program, v ktorom sa vykresľujú červené krúžky pri ťahaní myšou.
'<Motion>' ... ťahanie myškou bez stlačeného tlačidla myši'<B1-Motion>' ... ťahanie myškou pri stlačenom ľavom tlačidle myši'<B2-Motion>' ... ťahanie myškou pri stlačenom strednom koliesku myši'<B3-Motion>' ... ťahanie myškou pri stlačenom pravom tlačidle myši
Pri uvoľnení stlačeného tlačidla myši sa dá vyvolať nejaká obslužná funkcia.
Program, v ktorom sa vykreslí na mieste pozície myši malý biely krúžok v momente pustenia (uvolnenia tlačidla myši):
'<ButtonRelease-1>' ... pustenie ľavého tlačidla myši'<ButtonRelease-2>' ... pustenie stredého tlačidla myši'<ButtonRelease-3>' ... pustenie pravého tlačidla myši
Na udalosti stlačenia klávesu použijeme metódu .bind_all('klaves', funkcia), kde funkcia je názov funkcie, ktorá sa vyvolá po stlačení klávesu 'klaves'. Kláves je konkrétny znak na klávesnici, napr. 'a' alebo 'w', alebo názov ovládacieho klávesu. Príklady ovládacích klávesov:
'<Up>' – šípka hore,'<Down>' – šípka dole,'<Right>' – šípka vpravo,'<Left>' – šípka vľavo,'<space>' – medzera,'<Return>' – enter .bind(), napríklad event. Cez tento parameter sa môžu funkcii predávať podrobnejšie informácie o udalosti. Rovnako ako pri kliknutí myši aj pri stlačení klávesu sa posielajú v tomto parametri súradnice aktuálnej pozície myši, alebo aj informácie o zatlačenom klávese.
Program, v ktorom sa vykresľujú rôzne útvary na plátno, podľa udalostí: po stlačení klávesy 's' sa vykreslí štvorec na mieste kurzoru myši, po stlačení klávesy 'k' sa vykreslí na pozícii myšky krúžok, po stlačení šípky hore, dole resp. vpravo sa na mieste kurzoru myši vykreslí odpovedajúca šípka.
Vytvor prostredie pre hru piškvorky pre dvoch hráčov.
Pomôcka:
Najprv si vytvorte herný plán a potom zabezpečte, aby ľavým tlačidlom myši kreslilo na mieste kliknutia červené prstence (červený kruh v strede s bielym kruhom) a pravým tlačidlom modré krížiky (dve hrubšie modré čiary).
platno = tkinter.Canvas(bg="white", width=300, height=300)
platno.pack()
def plan():
for i in range(1,300,30):
platno.create_line(i,0,i,300)
platno.create_line(0,i,300,i)
plan()
Vytvor program, ktorý bude pri ťahaní myškou kresliť šikmú hrubšiu čiaru (ako hrot kaligrafického pera), jej farba nech je náhodná.
Pomôcka:
Funkcia na voľbu náhodnej pastelovej farby vo forme napr.'#A3F5B2'
return f"#{random.randint(0x808080, 0xFFFFFF):06x}"
Vytvor program, ktorý pri kliknutí na plátno na zvolené miesto vykreslí planétu Zem (obrázok zo súboru globe.png) a pri stláčaní klávesov so šípkami sa bude zemeguľa pohybovať zvoleným smerom (na jedno zatlačenie o 10 pixelov).
1. Čo robí metóda 2. Aký je rozdiel medzi metódami 3. Čo robí metóda 4. Čo robí metóda 5. Aký je hlavný rozdiel medzi 6.Čo obsahuje parameter 7. Ktorý reťazec správne reprezentuje kliknutie ľavým tlačidlom myši? 8. Ktorý reťazec správne reprezentuje ťahanie so stlačeným ľavým tlačidlom myši? 9. Čo za udalosť reprezentuje raťazec 10. Ktorý z nasledujúcich príkazov zabezpečí, že stlačenie klávesu Pomôcka:
Funkcia na vykreslenie planéty zo súboru 'globe.png' na plátno:
def kresli(event):
global co
surX = event.x
surY = event.y
co=platno.create_image(surX,surY,image=zem)
Overenie vedomostí
Test - Udalosti
platno.move(objekt, x, y)?
b) Presunie daný objekt o relatívnu hodnotu x, y
c) Nastaví absolútne súradnice objektu
d) Duplikuje prvok na novú pozíciu
move() a coords() v tkinteri (Canvas)? move() zmení farbu objektu, coords() nastaví jeho polohu
b) move() presúva relatívne, coords() nastavuje absolútne súradnice
c) move() presúva absolútne, coords() relatívne
d) Obe robia to isté
itemconfig()?
b) Odstraňuje daný prvok z plátna
c) Presúva objekt po plátne
d) Umožňuje zmeniť vlastnosti (napr. farbu, text, hrúbku čiary) objektu
platno.bind('udalost', obsluha) v Tkinteri?
b) Trvalo mení farbu plátna
c) Priradí funkciu obsluha pre všetky plátna v okne
d) Ukončí aplikáciu po výskyte udalosti
bind() a bind_all()?bind_all() funguje len na tlačidlá myši
b) bind() viaže udalosť na konkrétne plátno, bind_all() na všetko v aplikácii
c) bind_all() je zastaraný príkaz
d) bind() viaže udalosť iba na hlavné okno aplikácie
event odovzdaný do funkcie obsluhy?
b) Informácie o type udalosti, pozícii myši, a stave kláves
c) Len čas udalosti
d) Nič, ak sa neaktivuje bind_all()
"<Mouse-1>"
b) "<LeftClick>"
c) "<Button-1>"
d) "<Click-Left>"
"<Button-1>"
b) "<Motion-1>"
c) "<ButtonRelease-1>"
d) "<B1-Motion>"
"<Dounle-Button-1>"?
b) ťahanie pri stlačenom ľavom tlačidle
c) pustenie ľavého tlačidla myši
d) takáto udalosť neexistuje
"Escape" ukončí aplikáciu?platno.bind("<Escape>", quit)
b) platno.bind_all("<Escape>", quit)
c) platno.bind_key("<Escape>", quit)
d) platno.bind_global("<Escape>", quit)
Späť na hlavnú stránku