from tkinter import *
root = Tk()
statx = 275 # Коордмнаты начала x нижний левый угол
staty = 275 # Коордмнаты начала y нижний левый угол
def move(event): # Функция вызывается событием
global statx
global staty
x = event.x # Координаты события x
y = event.y # Координаты события y
z = 1 # Шаг по y
deltax = (x + 25) - statx # Расстояние, которое надо пройти по x
deltay = (y + 25) - staty # Расстояние, которое надо пройти по y
if deltax >= 0: # Если расстояние по x положительное или равно 0
a = 1 # 1 - положительный символ
else: # Если расстояние по x отридцательное
a = 2 # Отридцательный символ
if deltay > 0: # Если расстояние по y положительное
b = 1 # 1 - положительный символ
stepx = abs(deltax / deltay) # Шаг по х равено делению расстояния x на y
steps = deltay # Шагов всего расстояние y
elif deltay == 0: # Если расснояние по y равно 0
b = 1 # 1 - положительный символ
z = 0 # Шаг по y равен 0
stepx = 1 # Шаг по х равено 1
steps = deltax # Шагов всего расстояние x
else: # Если расснояние по y отридцательное
b = 2 # Отридцательный символ
stepx = abs(deltax / deltay) # Шаг по х равено делению расстояния x
steps = deltay # Шагов всего расстояние y
statx = (event.x + 25)
staty = (event.y + 25)
if a == 1: # Если по x положительное или 0
if b == 1:
c.unbind('<Button-1>')
for i in range(abs(steps)):
root.after(10, lambda: katis(stepx, z))
c.bind('<Button-1>', move)
else:
c.unbind('<Button-1>')
for i in range(abs(steps)):
root.after(10, lambda: katis(stepx, (-z)))
c.bind('<Button-1>', move)
else:
if b == 1:
c.unbind('<Button-1>')
for i in range(abs(steps)):
root.after(10, lambda: katis((-stepx), z))
c.bind('<Button-1>', move)
else:
c.unbind('<Button-1>')
for i in range(abs(steps)):
root.after(10, lambda: katis((-stepx), (-z)))
c.bind('<Button-1>', move)
statx = (event.x + 25)
staty = (event.y + 25)
def katis(s, z):
c.move(ball, s, z)
c = Canvas(width=500, height=500, bg='white')
c.pack()
ball = c.create_oval(((statx - 50), (staty - 50)), (statx, staty), fill='green')
c.bind('<Button-1>', move)
root.mainloop()
А вот здесь катится! В чём разница
from tkinter import *
root = Tk()
c = Canvas(width=300, height=200, bg='white')
c.pack()
ball = c.create_oval(0, 100, 40, 140, fill='green')
def coords(event):
x = event.x
y = event.y
s = '{}x{}'.format(x, y)
root.title(s)
def motion(x_new, x_step, y_step, flag=1):
c.unbind('<Button-1>')
c.itemconfig(ball, fill='green2')
c.move(ball, x_step, y_step)
if flag == 1:
if c.coords(ball)[0] + 20 < x_new:
root.after(10, lambda: motion(x_new, x_step, y_step))
else:
c.bind('<Button-1>', click)
c.itemconfig(ball, fill='green')
else:
if c.coords(ball)[0] + 20 > x_new:
root.after(10, lambda : motion(x_new, x_step, y_step, -1))
else:
c.bind('<Button-1>', click)
c.itemconfig(ball, fill='green')
def click(event):
p = c.coords(ball)
x1 = p[0]
y1 = p[1]
x_ball = x1 + 20
y_ball = y1 + 20
dx = abs(event.x - x_ball)
dy = abs(event.y - y_ball)
if dx > dy:
x_step = 1
y_step = dy / dx
else:
x_step = dx / dy
y_step = 1
if event.x < x_ball:
x_step *= -1
if event.y < y_ball:
y_step *= -1
if event.x > x_ball:
motion(event.x, x_step, y_step, 1)
else:
motion(event.x, x_step, y_step, -1)
c.bind('<Button-1>', click)
c.bind('<Motion>', coords)
root.mainloop()