Create vrací identifikátor objektu, který budeš potřebovat, abys s ním pak mohl pracovat. Na posunutí objektu můžeš použít move. Pohyb uděláš tak, že budeš opakovaně volat move. Na to můžeš použít after. Takže si jen potřebuješ pamatovat identifikátor objektu a jestli/jak se má pohybovat.
Kliknutí na objekt canvasu můžeš odchytit pomocí canvas.tag_bind. Nemyslím si, že bys dostal úlohu na věci, které jste se neučili.
import math, random
from tkinter import Tk, Canvas
class Movable:
def __init__(self, canvas, cid, dx, dy):
self.canvas = canvas
self.cid = cid
self.dx = dx
self.dy = dy
self.moving = False
def toggle(self):
self.moving = not self.moving
def move(self):
if not self.moving:
return
x, y = self.canvas.coords(self.cid)
w, h = self.canvas.winfo_width(), self.canvas.winfo_height()
if not 0 <= x + self.dx < w:
self.dx *= -1
if not 0 <= y + self.dy < h:
self.dy *= -1
self.canvas.move(self.cid, self.dx, self.dy)
def main():
w, h = 400, 400
root = Tk()
canvas = Canvas(root, width=w, height=h)
canvas.pack()
movables = {}
for idx, key in enumerate('abcdefghijklmnopqrstuvwxyz'):
a = idx * math.pi / 13
x = math.cos(a)
y = math.sin(a)
cid = canvas.create_text(w / 2 + x * w / 4, h / 2 + y * h / 4, text=key)
movables[key] = Movable(canvas, cid, x * 10, y * 10)
def onkey(event):
key = event.char.lower()
if key in movables:
movables[key].toggle()
def onupdate():
for obj in movables.values():
obj.move()
root.after(100, onupdate)
root.bind('<Key>', onkey)
root.after(100, onupdate)
root.mainloop()
if __name__ == '__main__':
main()