我使用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()
但窗口只是冻结,直到它完成,所有留给我的是字符串的最后一个字符。
任何人都可以帮助我吗?
答案 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()