【问题标题】:Tkinter: Animated CanvasTkinter:动画画布
【发布时间】:2018-01-07 07:41:07
【问题描述】:

我想在 Tkinter 中制作一个画布,它应该每隔一秒移动一次。 我已经写了这段代码。

import time
from tkinter import *

root = Tk()
root.geometry('800x800')
c = Canvas(root, width=500, height=500)
c.config(bg='#00f')
c.place(x=0)

y = 0
while True:
    print(y)
    c.place(x=y)
    y -= 50
    if y < -500:
        break
    time.sleep(1)
root.mainloop()

在这里,我使用 While Loop 制作动画,其中每 1 秒后,A Blue Canvas 将移动到 -ve x 轴.

它正在按我的意愿移动,但窗口在动画之后出现(因为我在 While 循环之后使用了 root.mainloop()),我不能使用 root.mainloop() While Loop 之前,因为它会给出错误。

有没有其他方法可以让动画只在创建窗口后才运行?

【问题讨论】:

标签: python python-3.x animation tkinter tkinter-canvas


【解决方案1】:

据我了解,mainloop() 基本上保留了应用程序/小部件的渲染。 mainloop() 实际上所做的就是这个

while True:
    tk.update_idletasks()
    tk.update()

所以这意味着你的程序中唯一的渲染是由最后的root.mainloop()调用完成的,所以你只需要使用mainloop()函数中的内容并将它放在你自己的 主循环。

例如:

while True:
    root.update_idletasks()
    root.update()
    print(y)
    c.place(x=y)
    y -= 50
    if y < -500:
        break
    time.sleep(1)

然后,如果您希望应用程序在 y 低于 -500 后停止渲染,那么只需删除底部的 root.mainloop() 调用即可。

【讨论】:

  • 这并不完全正确。 updateupdate_idletasks 的超集。您无需同时调用它们,只需调用update 即可。此外,每次您在该循环中睡眠时,GUI 都会变得无响应。使用此解决方案,您的 GUI 将响应几毫秒,冻结一秒,响应几毫秒,...
猜你喜欢
  • 2022-11-02
  • 2020-05-15
  • 2015-12-18
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2013-12-28
相关资源
最近更新 更多