如何制作一个加速文本动画的文本按钮

时间:2016-01-25 06:08:09

标签: python tkinter

所以基本上,我的文字是按字符输入的。代码:

text = "test"

delta = 40
delay = 0
for i in range(len(text) + 1):
    s = test_string[:i]
    update_text = lambda s=s: canvas.itemconfigure(variable, text=s)
    canvas.after(delay, update_text)
    delay += delta

这是一个函数内部,让我们调用:def NewEvent()。我想要做的是创建一个带有文本“Skip”的文本按钮,它将delta更改为更低的数字,从而在点击时加速动画。我似乎无法弄清楚,通常当你点击文字时,它有以下几点:

skipbutton = canvas.create_text((400,100), activefill="Medium Turquoise", text="Skip", fill="White", font=('Arial', 30), tags="skip")
canvas.tag_bind('skip', '<ButtonPress-1>', function)

问题是,它需要保持在同一个功能中。所以我想创建一个类似这样的if语句:

if delta is 40 and skip is ____:
    delta = 10

然而,我不知道在它之后会发生什么 - (跳过)是为了工作,或者即使这样可以工作......任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

您正在以一种使您的问题难以解决的方式进行动画制作。问题是您在显示第一帧之前计划所有动画帧。为了更改速度,您必须取消所有挂起的作业并重新创建新作业。这不是在Tkinter中进行动画的正确方法。

更好的解决方案是一次只能激活一个作业。你可以通过一个显示一帧动画的函数然后安排自己在将来再次运行来实现这一点。

一般结构如下:

def animate():
    <draw one frame of animation>
    if <there are more frames>:
        root.after(delay, animate)

在您的情况下,每个“框架”只是在字符串中添加一个字符,最后的条件是检查是否有更多字符。

一个简单的实现是将一个字符串传递给animate函数,让它从字符串中拉出第一个字符并将其附加到显示中。

例如:

def update_text(text):
    char = text[0]
    remainder = text[1:]
    current_string = canvas.itemcget(variable, "text")
    new_string = current_string + char
    canvas.itemconfigure(variable, text=new_string)
    if len(remainder) > 0:
        canvas.after(delay, update_text, remainder)

要启动动画,请为其指定要显示的字符串:

update_text("Hello, world")

这个函数依赖于延迟的全局变量,编写一个函数来加速动画或减慢它只需要你修改这个延迟:

def speedup():
    global delay
    delay = int(delay/2)

您可以通过按钮轻松调用它:

tk.Button(root, text="Speed up!", command=speedup)