Я реализовал следующий код для создания анимации, состоящей из строк с tkinter
(df
- это просто кадр данных Pandas).Проблема в том, что я просто вижу результат, но каким-то образом сон не выполняется (это означает, что анимация линий отсутствует).Как этого достичь?Более того, в большинстве случаев сны довольно малы (несколько миллисекунд), поэтому я не знаю, возможно ли это.
Во-вторых, я хотел бы сохранить анимацию как видео (например, mpeg),Решением было бы сохранить изображения и затем создать видео, но это немного громоздко (и я получу много изображений).Есть ли другая возможность (возможно, с использованием подхода, отличного от tkinter)?
root = Tk()
root.title("User {}".format(user_id))
canvas = Canvas(width=1920, height=1200, bg='white')
canvas.pack(expand=YES, fill=BOTH)
prev = None
temp_prev = None
for index, row in df.iterrows():
if prev is not None:
canvas.create_line(prev["x"], prev["y"], row["x"], row["y"])
if row["action"] == "ACTION_UP":
prev = None
else:
prev = row
if temp_prev is not None:
sleep(0.04)
temp_prev = row
root.mainloop()
РЕДАКТИРОВАТЬ: я обновил код, используя after()
.К сожалению, опять же только окончательный результат строится, но анимация отсутствует.
root = Tk()
root.title("User {}".format(user_id))
canvas = Canvas(width=1920, height=1200, bg='white')
canvas.pack(expand=YES, fill=BOTH)
root.after(0, add_line(canvas, df.iloc[1], 0, df, root))
root.mainloop()
def add_line(canvas, next, idx, df, root):
row = df.iloc[idx]
idx = idx + 1
if row["action"] != "ACTION_UP":
canvas.create_line(row["x"], row["y"], next["x"], next["y"])
next = df.iloc[idx + 1]
if (idx + 2) < len(df):
root.after(int(next['timestamp_offset'] - row['timestamp_offset']), add_line(canvas, next, idx, df, root))
else:
return