我已经实现了以下代码来创建一个包含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