A vászon elemeinek mozgatása
Már rég tudjuk, hogy utasításokat írhatunk közvetlenül a shell-be is. Ide is importálhatunk modulokat, hozhatunk létre vásznat, rajzolhatunk a vászonra. A grafikus utasítások is azonnal végrehajtódnak: a vászonra kirajzolódik az alakzat, a shell-be pedig kiír egy számot. Ez a kirajzolt alakzatnak a száma. Minden elem, melyet a canvas.create_ utasítással hozunk létre kap egy ilyen számot - 1-gyel kezdve. Ezeket a számokat használhatjuk az alakzat módosításakor, például ha odébb akarjuk rakni az alakzatot anélkül, hogy kiszámolnánk az új koordinátákat, megtehetjük így: canvas.move(2, 30, -15). Ez azt jelenti, hogy a 2-es számú alakzatot toljuk el 30 pontra az x (jobbra), és -15 pontra az y tengelyen (felfelé).
Az alakzatok számát megjegyezhetjük változóban is, és azt írhatjuk a move utasításba.
vonal = canvas.create_line(50, 50, 200, 150, width=5, fill='blue')
canvas.move(vonal, 30, 50)
Ha minden alakzatot mozgatni akarunk ugyanabba az irányba, akkor a számozás helyett használhatjuk az 'all' felírást: canvas.move('all', 5, 0). Ezzel találkoztunk már a törlésnél is. Innen már sejthetjük, hogy nem kell mindig mindent törölni, elég megadni azoknak az elemeknek a számát, amit törölni szeretnénk.
import tkinter
from random import *
canvas = tkinter.Canvas()
canvas.pack()
canvas.create_text(200, 200, text='Felirat')
canvas.create_rectangle(100, 100, 200, 150, fill='red')
canvas.create_line(50, 50, 150, 50, fill='blue')
canvas.create_oval(10, 100, 60, 150, fill='yellow')
def jobbra(esemeny):
canvas.move('all', 5, 0)
def balra(esemeny):
canvas.move('all', -5, 0)
canvas.bind_all('<Right>', jobbra)
canvas.bind_all('<Left>', balra)
Kérdések
- Mit fog csinálni a fenti program, ha a shell-ben újabb elemeket hozunk létre? Azokat is fogja mozgatni? Miért?
- Mi a különbség az 'all' paraméteren keresztül történő mozgatás, és a ciklussal való mozgatás között, ha a shell-ben újabb elemeket hozunk létre?
- Mi történik, ha olyan elemet akarunk mozgat vagy kitörölni, amit egyszer már töröltünk?
Összetett alakzatokat, amik több elemből állnak, is lehet mozgatni. Ha kihasználjuk a tags paramétert a rajzolásnál, akkor akár egyetlen move utasítással is meg tudjuk mozdítani az egész alakzatot. Nézzünk egy példát: Rajzoljunk egy kocsit, ami 3 alakzatból áll - egy téglalap és két kör.
canvas.create_rectangle(100, 150, 200, 200, fill='red', tags='kocsi')
canvas.create_oval(110, 135, 140, 165, fill='black', tags='kocsi')
canvas.create_oval(160, 135, 190, 165, fill='black', tags='kocsi')
def mozdulj():
canvas.move('kocsi', 10, 0)
canvas.after(100, mozdulj)
mozdulj()
A kocsi egy idő után kimegy a vászonról, nem fog tovább látszódni. Ebben az esetben azt szeretnénk, ha a másik oldalon felbukkanna. Több megoldás is van erre a problémára. Az eddig ismert utasításokat használva a legegyszerűbb a számunkra az lesz, ha változókban fogjuk tárolni a kocsi aktuális helyzetét. Ha túlmegy a vászon határán, akkor csak a helyzetét mutató változó értékét beállítjuk a másik oldalra.
import tkinter
canvas = tkinter.Canvas(width=600, height=300)
canvas.pack()
x = 100
canvas.create_rectangle(100, 150, 200, 200, fill='red', tags='kocsi')
canvas.create_oval(110, 135, 140, 165, fill='black', tags='kocsi')
canvas.create_oval(160, 135, 190, 165, fill='black', tags='kocsi')
def mozdulj():
global x
x = x + 10
canvas.move('kocsi', 10, 0)
if x > 600:
x = x - 600
canvas.move('kocsi',- 600, 0)
canvas.after(100, mozdulj)
mozdulj()
