【问题标题】:Typewriter effect in tkintertkinter 中的打字机效果
【发布时间】:2016-08-31 18:38:35
【问题描述】:

我正在使用 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()

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

谁能帮帮我?

【问题讨论】:

  • 我希望 slp 不是反弹 time.sleep,因为 Tkinter 不能正常工作。
  • 要修复“窗口冻结”,请使用 widget.update()。这里的小部件意味着标签、按钮、文本、列表框等

标签: python tkinter


【解决方案1】:

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

import tkinter as tk

root = tk.Tk()

word = 'hello'

def go(counter=1):
    l.config(text=word[:counter])
    if counter < len(word):
        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()

【讨论】:

  • 这仅在我们第一次按下按钮时有效,然后它会在几秒钟内输入文本。
  • @FaraazKurawle - 一个有效的批评,我已在编辑中修正。
【解决方案2】:

您需要让事件循环更新屏幕。最简单的方法是使用 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()

【讨论】:

    【解决方案3】:

    我认为这个答案比上述任何一个答案都更简单易懂

    解决办法是:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      相关资源
      最近更新 更多