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

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

我正在用python创建一个GUI应用程序,这是一个“ Lingo”文字游戏。在GUI的主屏幕上,我试图使字符每1秒出现在屏幕上一次。但是,我是这种python编程的新手,不确定如何做到这一点。我要同时出现以下几个字符,这些单词组成以下单词。

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

此刻,这些字符在GUI屏幕上出现在不同的x和y位置。例如,对于Leads一词,我希望1秒后出现“ l”,然后是“ 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,190,width = 2)
canvas.create_oval(210,280,width = 2)
canvas.create_oval(300,370,width = 2)
canvas.create_oval(390,460,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,text= "I",fill = "white")
n = canvas.create_text((245,text= "N",fill = "white")
g = canvas.create_text((335,text= "G",fill = "white")
o = canvas.create_text((425,text= "O",fill = "white")

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

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


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


l = canvas.create_text((137,201),fill = "white")
a = canvas.create_text((191,fill = "white")
r = canvas.create_text((245,text= "R",fill = "white")
g = canvas.create_text((299,fill = "white")
e = canvas.create_text((353,fill = "white")

l = canvas.create_text((137,255),fill = "white")
i = canvas.create_text((191,fill = "white")
s = canvas.create_text((245,fill = "white")
t = canvas.create_text((299,text= "T",309),fill = "white")
o = canvas.create_text((191,fill = "white")
i = canvas.create_text((245,fill = "white")
n = canvas.create_text((299,363),fill = "white")
o = canvas.create_text((353,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,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)

接下来,编写一个通过after调用此函数的函数。在这种情况下,它会一次从字符串中拉出一个字符,并继续每秒这样做一次,直到字符串完全显示为止。

def animate(canvas,string,color):
    """Draw each character in the string at one second intervals. """
    draw(canvas,string[0],color)
    if len(string) > 1:
        string = string[1:]
        canvas.after(1000,animate,canvas,x+width,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,box_id)

def animate(canvas,color)

animate(canvas,"Leads",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,text= "E",canvas.create_text((245,text= "A",canvas.create_text((299,text= "D",canvas.create_text((353,text= "S",............

canvas.create_text((137,363),text= "I",text= "N",text= "G",text= "O",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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-