【问题标题】:Method for having animated movement for canvas objects python为画布对象python进行动画运动的方法
【发布时间】:2015-09-08 10:08:13
【问题描述】:

我一直在尝试学习如何从谷歌移动画布项目,但是大多数地方显示的方法似乎对我没有预期的效果。现在我只是想让一个球在 1 秒内从屏幕的一侧移动到另一侧

from tkinter import *

root = Tk()
c = Canvas(root, width = 200, height = 100)
c.pack()
ball = c.create_oval(0, 25, 50, 75)
for i in range(25):
    c.move(ball, 6, 0)
    root.after(40)
root.mainloop()

运行时,这似乎在打开窗口之前移动了球,但是如果我先调用 mainloop,窗口会打开但球不会移动。

不确定它是如何设置的,但如果有人知道那将是很棒的。

【问题讨论】:

    标签: tkinter python-3.4 tkinter-canvas


    【解决方案1】:

    基本思想是使用after 来创建动画循环。最简单的形式如下:

    def animate():
        c.move(ball, 6, 0)
        root.after(33, animate)
    

    这会将对象移动 6 个像素,并在 33 毫秒内再次运行原因本身。更改该数字(本例中为 33)决定了项目移动的速度。 33ms 大约是 30fps。

    当然,您需要添加检查以查看项目是否在屏幕外,以便您可以停止循环或将项目移回左边缘。此外,您不应该依赖全局变量,但我想删除尽可能多的额外代码,以便您可以看到函数的基本性质。

    这是一个基于问题代码的完整工作示例:

    from tkinter import *
    
    def animate():
        c.move(ball, 6, 0)
        root.after(33, animate)
    
    root = Tk()
    c = Canvas(root, width = 200, height = 100)
    c.pack()
    ball = c.create_oval(0, 25, 50, 75)
    animate()
    root.mainloop()
    

    【讨论】:

    • 实际上,现在我试图将这个方法实现到我拥有的一些其他代码中,我将如何制作一个只运行有限时间的函数,如 animate?我尝试定义 'animate(time)' 并将其设为 'root.after(33, animate(time-1)) 所以这将是一个有限的重复函数,但是它与之前运行该函数的问题相同打开窗户
    • @user2627127:我无法在评论框中回答这个问题。搜索stackoverflow,有很多关于after使用的问答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2018-08-13
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多