打字机效果 tkinter python

typewriter effect tkinter python

所以我想做一个游戏,我想让标题成为打字机效果我知道打字机效果的代码只是不知道如何实现它。 pitanje_menu 是标签

ab=StringVar()
a=Label(textvariable=ab)
a.pack()
l=[]
for i in words:
    l.append(i)
    sleep(0.2)
    b=str(l)
    b=b.replace("[","")
    b=b.replace("]","")
    b=b.replace(", ","")
    b=b.replace(",","")
    b=b.replace("'","")
    b=b.replace("  ","")
    c=len(b)
    ab.set(f"{b[0:c-1]}{i}")
    a.update()


pitanje_menu = Label(win, text="the game", bg="black", fg="white", font= ('Open Sans', 100))
pitanje_menu.place(x= "770", y= "240", anchor=CENTER)
da_play = Button(win, text="play", bg="black", fg="white", font= ('Open Sans', 60), borderwidth=0, command=play)
da_play.place(x= "770", y= "490", anchor=CENTER)

tkinter,与所有 GUI 框架一样,是 event-driven。当您创建这些标签或采取任何行动时,什么都不会立即完成。所做的只是发送消息。这些消息将位于消息队列中,直到您到达 mainloop。主循环分派并处理所有这些消息,这会导致采取行动。

因此,在您 运行 循环时,屏幕上没有任何内容。您所做的只是延迟时间,直到主要 window 设置完毕。

所以,您需要做的是使用win.after每0.2秒请求一次回调。在该回调中,您将添加下一个字符,并请求另一个回调。你一次做一个。我会创建一个包含要显示的字母的全局列表。每次调用消耗一个字母,直到列表为空。

to_be_drawn = []

def callback():
    if not to_be_drawn:
        return
    nxt = to_be_drawn.pop(0)
    ab.set( ab.get() + nxt )
    win.after( 200, callback )

def start_typing(text):
    was_empty = not to_be_drawn
    text = text.replace('[','').replace(']','').replace(',','')
    to_be_drawn.extend( list(text) )
    if was_empty:
        win.after( 200, callback )

start_typing( "Hello, kitty!" )