tkinter中的打字机效果

时间:2016-05-05 20:26:49

标签: python tkinter

我使用tkinter在python中创建文本冒险,因为它易于使用的图形(按钮等)

我想添加一个效果,其中文字看起来像是要输入的。

def displayNextPart():
    for i in buttons:
        i.destroy()
    global curPart
    for char in story[curPart]["Text"]:
        slp(.05)
        w.config(text=char)
        sys.stdout.flush()

但窗口只是冻结,直到它完成,所有留给我的是字符串的最后一个字符。

任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

time.sleep()无法与Tkinter应用程序一起正常运行。使用after()方法,如以下示例所示:

import tkinter as tk

root = tk.Tk()

word = 'hello'

def go(counter=1):
    l.config(text=word[:counter])
    root.after(150, lambda: go(counter+1))

b = tk.Button(root, text='go', command=go)
l = tk.Label(root)
b.pack()
l.pack()

root.mainloop()

答案 1 :(得分:3)

您需要让事件循环更新屏幕。最简单的方法是使用tkinter的after方法编写自重复函数。

这是一个有效的例子。这使用文本小部件,但您可以轻松更新标签小部件或画布文本项。

import Tkinter as tk

def typeit(widget, index, string):
   if len(string) > 0:
      widget.insert(index, string[0])
      if len(string) > 1:
         # compute index of next char
         index = widget.index("%s + 1 char" % index)

         # type the next character in half a second
         widget.after(250, typeit, widget, index, string[1:])

root = tk.Tk()
text = tk.Text(root, width=40, height=4)
text.pack(fill="both", expand=True)
typeit(text, "1.0", "Hello, this is an \nexample of some text!")

root.mainloop()

答案 2 :(得分:1)

我认为这个答案比以上任何一个答案都更简单和容易

解决方案是:

from tkinter import *


root=Tk()
import sys
from time import sleep
words = "Typing effect in tkinter.py"
def update():
    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()
d=Button(text="click",command=update)
d.pack()
ab=StringVar()
a=Label(textvariable=ab)
a.pack()
root.mainloop()

当您按下按钮并更新标签时,上述代码有效。

但是如果您希望它自动启动,请使用:

from tkinter import *


root=Tk()
import sys
from time import sleep
words = "Typing effect in tkinter.py"
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()
root.mainloop()