A vászon elemeinek mozgatása

2019.11.11

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

  1. Mit fog csinálni a fenti program, ha  a shell-ben újabb elemeket hozunk létre? Azokat is fogja mozgatni? Miért?
  2. 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?
  3. 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()

© 2023 Minden jog fenntartva.
Az oldalt a Webnode működteti
Készítsd el weboldaladat ingyen! Ez a weboldal a Webnode segítségével készült. Készítsd el a sajátodat ingyenesen még ma! Kezdd el