Необходимо сделать анимированный квадрат tkinter
Приветствую и всех за одно с праздником. Решаю вот такую задачку: Исходно фигура имеет вид квадрата со стороной 400 пикселей. При запуске движения центры сторон начинают попиксельно сходиться к центру фигуры со скоростью 8 пик-селей/сек., превращая квадрат в крест X. Затем начинается обратное движение, и фигура возвращается к квадрату. Движение циклически повторяется. Запуск и остановка движения - радионабор. Не могу только допереть как можно это движение реализовать, надеюсь хотя бы на подсказку.
from tkinter import *
root = Tk()
root.title('main')
root.geometry('600x800')
c = Canvas(width=600, height=800, bg='white')
c.place(x=0, y=0)
n = 8
def move():
s=c.coords(l1)
s1=c.coords(l3)
s2=c.coords(l5)
s3=c.coords(l7)
if s[3] < 200:
s[3] = s[3]+n
c.coords(l1, 200,100,300,s[3])
c.coords(l2, 300,s[3],400,100)
print(s)
print(s[3])
c.after(0)
if s1[2] > 300:
s1[2] = s1[2]-n
c.coords(l3, 400,100,s1[2],200)
c.coords(l4, s1[2],200,400,300)
c.after(0)
if s2[3] > 200:
s2[3] = s2[3]-n
c.coords(l5, 400,300,300,s2[3])
c.coords(l6, 300,s2[3],200,300)
c.after(0)
if s3[2] < 300:
s3[2] = s3[2]+n
c.coords(l7, 200,300,s3[2],200)
c.coords(l8, s3[2],200,200,100)
c.after(0)
#c.coords(l1, 200,100,300,150)
#c.coords(l2, 300,150,400,100)
b1=Button(text='Запуск', command = move)
b1.pack()
l1 = c.create_line(200,100,300,100)
l2 = c.create_line(300,100,400,100)
l3 = c.create_line(400,100,400,200)
l4 = c.create_line(400,200,400,300)
l5 = c.create_line(400,300,300,300)
l6 = c.create_line(300,300,200,300)
l7 = c.create_line(200,300,200,200)
l8 = c.create_line(200,200,200,100)
lcenter = c.create_line(200,100,300,200)
#x=300,y=200 координаты центра.
root.mainloop()
Ответы (1 шт):
Начните с того, что уберите рекуурсивный вызов move из функции.
После этого виснуть перестанет, а начнет по каждому нажатию кнопки одна линия двигаться. Далее продолжайте отладку и исправление. Вам надо, чтобы двигались все 8 линий, и чтобы на кнопку были завязаны только начало и конец движения. Думаю, не так много осталось исправить.