Home > OS >  any way to write text letter by letter in tkinter
any way to write text letter by letter in tkinter

Time:06-23

I want to make a kind of chat box, and I would like the letters to be word by word, I did that function but it stays loading until the loop ends, and it gives me the final result, i see in other pages and questions, and i saw that the "after" funtion works, maybe i did something wrong when implementing it, sorry for my english

import tkinter as tk
from tkinter import ttk
import os
from PIL import ImageTk
import PIL.Image    

# parent window where is an image of the chatbox
def Ventana_Text_Box(event):
    #Ventana De Text box
    global ventana_BT
    
    ventana_BT = tk.Tk()
    ventana_BT.geometry("300x300 " str(200) " " str(100))
    ventana_BT.configure(background="gray")
    
    I_Text_Box_Image    = ImageTk.PhotoImage(I_Text_Box)
    
    Box_Texto = tk.Label(ventana_BT, image = I_Text_Box_Image, bg="gray")
    Box_Texto.pack()
    Box_Texto.bind("<Button-1>", Ventana_Texto)
    Box_Texto.bind("<Button-3>", escribir_texto)
    #ventana_BT.wm_attributes("-topmost", 1)
    ventana_BT.wm_attributes("-transparentcolor", "gray")
    ventana_BT.overrideredirect(1)
    
    ventana_BT.mainloop()

# window where the text will be
def Ventana_Texto(event):
    # Ventana hija para el texto
    global ventana_T
    global W_texto
    
    ventana_T = tk.Toplevel()
    ventana_T.geometry("300x300 " str(ventana_BT.winfo_rootx()-70) " " str(ventana_BT.winfo_rooty() 140))
    ventana_T.configure(background="gray")

    W_texto = tk.Label(ventana_T, text="", bg="pink")
    W_texto.config(fg="black", font=("Consola", 15))
    W_texto.pack()
    
    #escribir_texto("Hola")
   
    #ventana_T.wm_attributes("-topmost", 1)
    ventana_T.wm_attributes("-transparentcolor", "gray")
    ventana_T.overrideredirect(1)
    ventana_T.mainloop()
# Function that changes the text from letter to letter
def mecanografiar(texto):
   
    for i in range(len(texto) 1):
        return W_texto.config(text=texto[0:i])
#   test function to see if it works write "HOLA" 
def escribir_texto(event):
    texto = "hola"
    W_texto.after(400, mecanografiar(texto))
            
scriptpath          = os.path.abspath(__file__) 
scriptdir           = os.path.dirname(scriptpath) 
Text_Box            = os.path.join(scriptdir, "Dialogo", "text_box.png")
#800x712
I_Text_Box          = PIL.Image.open(Text_Box)
W_I = 350
H_I = W_I*712/800
I_Text_Box          = I_Text_Box.resize((W_I,int(H_I)), PIL.Image.ANTIALIAS)

if __name__ == "__main__":
    
    Ventana_Text_Box(None)

CodePudding user response:

import tkinter as tk

root = tk.Tk()
root.geometry('200x200')

# this is whatever string you want to type out slowly
chat_str = 'Hello, friend!'

# storing text in a StringVar will update the label automatically
# whenever the value of the variable is changed (see 'textvariable' below)
text_var = tk.StringVar()
label = tk.Label(textvariable=text_var)
label.pack()

# index represents the character index in 'chat_str'
index = 0
# we need an empty string to store the typed out string as it updates
placeholder = ''


def type_text():
    # use 'global' to allow the function to access these variables
    global index
    global placeholder
    try:
        # concat the placeholder with the next character in 'chat_str'
        placeholder  = chat_str[index]
        # set 'text_var' to update the label automatically
        text_var.set(placeholder)
        # go to the next index (character) in 'chat_str'
        index  = 1
        # call this function again after 150mS
        # (change this number to modify the typing speed)
        root.after(150, type_text)
    except IndexError:  # when you run out of characters...
        return  # bail


# NOTE:
# using a 'try:except' block above avoids issues stopping 'root.after()'


type_text()
root.mainloop()
  • Related