Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中执行文本动画?_Python_Animation_Tkinter - Fatal编程技术网

如何在Python中执行文本动画?

如何在Python中执行文本动画?,python,animation,tkinter,Python,Animation,Tkinter,我正在用python创建一个GUI应用程序,它是一个“行话”文字游戏。在我的GUI主屏幕上,我试图让字符每1秒出现在屏幕上。然而,我对这种类型的python编程还不熟悉,不确定如何进行。我有以下字符,我想一次出现一个,组成以下单词 “线索” “大” “列表” “腰部” “行话” 目前,这些字符出现在GUI屏幕上不同的x和y位置。例如,对于单词leads,我希望“l”在1秒后出现,然后是“e”,依此类推。我意愿这些角色在1秒后按顺序出现在当前位置。我曾尝试使用time.sleep()和after(

我正在用python创建一个GUI应用程序,它是一个“行话”文字游戏。在我的GUI主屏幕上,我试图让字符每1秒出现在屏幕上。然而,我对这种类型的python编程还不熟悉,不确定如何进行。我有以下字符,我想一次出现一个,组成以下单词

“线索” “大” “列表” “腰部” “行话”

目前,这些字符出现在GUI屏幕上不同的x和y位置。例如,对于单词leads,我希望“l”在1秒后出现,然后是“e”,依此类推。我意愿这些角色在1秒后按顺序出现在当前位置。我曾尝试使用time.sleep()和after()函数,但我无法让它们工作。对我如何表演这个动画有什么建议吗?基本上,当GUI游戏第一次运行时,我尝试将玩游戏的用户作为背景动画来实现

import tkinter as tk
from tkinter import ttk
import tkinter.font as tkFont
import numpy as np
import time

root = tk.Tk()
canvas = tk.Canvas(root, height = '500', width = '500')
canvas.pack()

#Create Title Lingo Balls
canvas.create_oval(30,10,100,80, outline = "medium blue", fill = "medium blue", width = 2)
canvas.create_oval(120,10,190,80, outline = "medium blue", fill = "medium blue", width = 2)
canvas.create_oval(210,10,280,80, outline = "medium blue", fill = "medium blue", width = 2)
canvas.create_oval(300,10,370,80, outline = "medium blue", fill = "medium blue", width = 2)
canvas.create_oval(390,10,460,80, outline = "medium blue", fill = "medium blue", width = 2)

#Print Letters Inside of Lingo Ball Circles
letterfont = tkFont.Font(size = 30)
l = canvas.create_text((65, 46), text= "L", font = letterfont, fill = "white")
i = canvas.create_text((155, 46), text= "I", font = letterfont, fill = "white")
n = canvas.create_text((245, 46), text= "N", font = letterfont, fill = "white")
g = canvas.create_text((335, 46), text= "G", font = letterfont, fill = "white")
o = canvas.create_text((425, 46), text= "O", font = letterfont, fill = "white")

#Create Homepage Game Board
canvas.create_rectangle(210,220,280,290, outline = "blue", fill = "blue", width = 200)
canvas.create_line(164,120,164,390, fill = "white")
canvas.create_line(218,120,218,390, fill = "white")
canvas.create_line(272,120,272,390, fill = "white")
canvas.create_line(326,120,326,390, fill = "white")
canvas.create_line(110,174,380,174, fill = "white")
canvas.create_line(110,228,380,228, fill = "white")
canvas.create_line(110,282,380,282, fill = "white")
canvas.create_line(110,336,380,336, fill = "white")

canvas.create_rectangle(110,120,164,174, outline = "white", fill = "red") #create red squares for correctly guessed letters
canvas.create_rectangle(110,174,164,228, outline = "white", fill = "red")
canvas.create_rectangle(110,228,164,282, outline = "white", fill = "red")
canvas.create_rectangle(110,282,164,336, outline = "white", fill = "red")
canvas.create_rectangle(110,336,164,390, outline = "white", fill = "red")
canvas.create_rectangle(272,174,326,228, outline = "white", fill = "red")
canvas.create_rectangle(164,228,218,282, outline = "white", fill = "red")
canvas.create_rectangle(164,336,218,390, outline = "white", fill = "red")
canvas.create_rectangle(218,336,272,390, outline = "white", fill = "red")
canvas.create_rectangle(272,336,326,390, outline = "white", fill = "red")
canvas.create_rectangle(326,336,380,390, outline = "white", fill = "red")
canvas.create_rectangle(164,282,218,336, outline = "white", fill = "yellow") #create yellow squares for guessed letters that are in word, but out of place
canvas.create_rectangle(218,282,272,336, outline = "white", fill = "yellow")
canvas.create_rectangle(272,282,326,336, outline = "white", fill = "yellow")


l = canvas.create_text((137, 147), text= "L", font = letterfont, fill = "white")
e = canvas.create_text((191, 147), text= "E", font = letterfont, fill = "white")
a = canvas.create_text((245, 147), text= "A", font = letterfont, fill = "white")
d = canvas.create_text((299, 147), text= "D", font = letterfont, fill = "white")
s = canvas.create_text((353, 147), text= "S", font = letterfont, fill = "white")


l = canvas.create_text((137, 201), text= "L", font = letterfont, fill = "white")
a = canvas.create_text((191, 201), text= "A", font = letterfont, fill = "white")
r = canvas.create_text((245, 201), text= "R", font = letterfont, fill = "white")
g = canvas.create_text((299, 201), text= "G", font = letterfont, fill = "white")
e = canvas.create_text((353, 201), text= "E", font = letterfont, fill = "white")

l = canvas.create_text((137, 255), text= "L", font = letterfont, fill = "white")
i = canvas.create_text((191, 255), text= "I", font = letterfont, fill = "white")
s = canvas.create_text((245, 255), text= "S", font = letterfont, fill = "white")
t = canvas.create_text((299, 255), text= "T", font = letterfont, fill = "white")
s = canvas.create_text((353, 255), text= "S", font = letterfont, fill = "white")

l = canvas.create_text((137, 309), text= "L", font = letterfont, fill = "white")
o = canvas.create_text((191, 309), text= "O", font = letterfont, fill = "white")
i = canvas.create_text((245, 309), text= "I", font = letterfont, fill = "white")
n = canvas.create_text((299, 309), text= "N", font = letterfont, fill = "white")
s = canvas.create_text((353, 309), text= "S", font = letterfont, fill = "white")

l = canvas.create_text((137, 363), text= "L", font = letterfont, fill = "white")
i = canvas.create_text((191, 363), text= "I", font = letterfont, fill = "white")
n = canvas.create_text((245, 363), text= "N", font = letterfont, fill = "white")
g = canvas.create_text((299, 363), text= "G", font = letterfont, fill = "white")
o = canvas.create_text((353, 363), text= "O", font = letterfont, fill = "white")

root.mainloop()

tkinter中动画的基本概念是首先编写一个函数,该函数可以执行动画的一个帧,然后让另一个函数调用它,然后安排将来再次调用它自己

因此,让我们从一个名为
draw
的函数开始,该函数在给定坐标下在一个框中绘制一个字母:

def draw(canvas, char, x, y, color):
    """Draw one character in a box at the given coordinate"""

    text_id = canvas.create_text(x, y, text=char, anchor="nw", font=letterfont)
    x0, y0, x1, y1 = canvas.bbox(text_id)
    box_id = canvas.create_rectangle(x0-1, y0-1, x1+1, y1+1, fill=color, outline="black")
    canvas.lift(text_id, box_id)
接下来,编写一个函数,通过之后的
调用此函数。在这种情况下,它一次从字符串中提取一个字符,并继续每隔一秒提取一个字符,直到字符串完全显示为止

def animate(canvas, string, x, y, color):
    """Draw each character in the string at one second intervals. """
    draw(canvas, string[0], x, y, color)
    if len(string) > 1:
        string = string[1:]
        canvas.after(1000, animate, canvas, string, x+width, y, color)
我不建议您完全按照原样使用此代码。它计算每个字母的坐标,即使您已经预先计算了坐标,而且最好将其作为类或类的一部分实现

无论如何,该技术保持不变,取决于
animate
函数使用
after
调度自身,然后调用其他函数执行一帧动画


以下是完整程序中的上述代码:

import tkinter as tk
import tkinter.font as tkFont

root = tk.Tk()
canvas = tk.Canvas(root)
canvas.pack(fill="both", expand=True)
letterfont = tkFont.Font(size = 30)
width = letterfont.measure("0")

def draw(canvas, char, x, y, color):
    """Draw one character in a box at the given coordinate"""

    text_id = canvas.create_text(x, y, text=char, anchor="nw", font=letterfont)
    x0, y0, x1, y1 = canvas.bbox(text_id)
    box_id = canvas.create_rectangle(x0-1, y0-1, x1+1, y1+1, fill=color, outline="black")
    canvas.lift(text_id, box_id)

def animate(canvas, string, x, y, color):
    """Draw each character in the string at one second intervals. """
    draw(canvas, string[0], x, y, color)
    if len(string) > 1:
        string = string[1:]
        canvas.after(1000, animate, canvas, string, x+width, y, color)

animate(canvas, "Leads", 2, 2, "bisque")

root.mainloop()

要一次显示一个字符,可以在开始时将文本对象设置为隐藏,然后使用计时器按顺序显示每个字母

lstltr = [  # store all letter object ids in list
canvas.create_text((137, 147), text= "L", font = letterfont, fill = "white", state= tk.HIDDEN),
canvas.create_text((191, 147), text= "E", font = letterfont, fill = "white", state= tk.HIDDEN),
canvas.create_text((245, 147), text= "A", font = letterfont, fill = "white", state= tk.HIDDEN),
canvas.create_text((299, 147), text= "D", font = letterfont, fill = "white", state= tk.HIDDEN),
canvas.create_text((353, 147), text= "S", font = letterfont, fill = "white", state= tk.HIDDEN),

............

canvas.create_text((137, 363), text= "L", font = letterfont, fill = "white", state= tk.HIDDEN),
canvas.create_text((191, 363), text= "I", font = letterfont, fill = "white", state= tk.HIDDEN),
canvas.create_text((245, 363), text= "N", font = letterfont, fill = "white", state= tk.HIDDEN),
canvas.create_text((299, 363), text= "G", font = letterfont, fill = "white", state= tk.HIDDEN),
canvas.create_text((353, 363), text= "O", font = letterfont, fill = "white", state= tk.HIDDEN)
]

def countdown(idx):
    # change text in label        
    if idx < len(lstltr):
        canvas.itemconfigure(lstltr[idx], state=tk.NORMAL) # show letter object
        root.after(100, countdown, idx+1)  # 1/10 second

countdown(0)  # start timer

root.mainloop()
lstltr=[#在列表中存储所有字母对象ID
canvas.create_text((137,147),text=“L”,font=lettfont,fill=“white”,state=tk.HIDDEN),
canvas.create_text((191147),text=“E”,font=lettfont,fill=“white”,state=tk.HIDDEN),
canvas.create_text((245147),text=“A”,font=lettfont,fill=“white”,state=tk.HIDDEN),
canvas.create_text((299147),text=“D”,font=lettfont,fill=“white”,state=tk.HIDDEN),
canvas.create_text((353147),text=“S”,font=lettfont,fill=“white”,state=tk.HIDDEN),
............
canvas.create_text((137363),text=“L”,font=lettfont,fill=“white”,state=tk.HIDDEN),
canvas.create_text((191363),text=“I”,font=lettfont,fill=“white”,state=tk.HIDDEN),
canvas.create_text((245363),text=“N”,font=lettfont,fill=“white”,state=tk.HIDDEN),
canvas.create_text((299363),text=“G”,font=lettfont,fill=“white”,state=tk.HIDDEN),
canvas.create_text((353363),text=“O”,font=lettfont,fill=“white”,state=tk.HIDDEN)
]
def倒计时(idx):
#更改标签中的文本
如果idx