How to use sleep for a loading effect tkinter graphical interface

0

I want to use the sleep of the time module to give a load / wait effect on checking for a condition. Without using tkinter functions, the effect works perfectly, but when I try to do the same with tkinter , this no longer works. Could anyone tell me why? follows an example code below:

from tkinter import *
from time import sleep

# Janela qualquer
janela = Tk()

# Variáveis com valores hipotéticos
a = 12
b = 15

lb_relacao_vh = Label(janela, font=("Century Gothic", 10, "bold"), bd=5,
                    text="Verificando a relação vão/altura.", anchor="w")
lb_relacao_vh.grid(row=0, column=0, sticky=W)
sleep(1)
lb_relacao_vh['text'] = "Verificando a relação vão/altura.."
sleep(1)
lb_relacao_vh['text'] = "Verificando a relação vão/altura..."

if a > b:
   lb_relacao_vh['fg'] = 'red'
   lb_relacao_vh['text'] = 'Verificando a relação vão/altura...ERRO!'
else:
   lb_relacao_vh['fg'] = 'green'
   lb_relacao_vh['text'] = 'Verificando a relação vão/altura...OK!'


janela.mainloop()
    
asked by anonymous 27.08.2018 / 16:06

1 answer

0

Basically the Python interpreter is reading line by line from your code, when it reaches the line of sleep() it stays idle until the time that has passed is finished (note that the window does not open ).

After the sleep () time ends:

  • Configure the widget.
  • Performs the checking of if .
  • Enters mainloop() now the window is created and displayed, however the widget is ready.

To avoid this, the interface must be created at the same time as the sleep() , configuration and verification ( if ), so the code must be asynchronous ( in this case ). .

Based on your code and without making major changes or paradigm shifting, I came up with this code:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Código assíncrono (threading)"""

import threading
import tkinter as tk
from time import sleep

# Janela qualquer (main window)
janela = tk.Tk()

# Variáveis com valores hipotéticos
a = 12
b = 15

# Criando o widget.
lb_relacao_vh = tk.Label(janela, font=("Century Gothic", 10, "bold"), bd=5,
                         text="Verificando a relação vão/altura.", anchor=tk.W)
# Posicionando o widget na janela.
lb_relacao_vh.grid(row=0, column=0, sticky=tk.W)


# Método que será executado de forma assíncrona.
def verificar_altura():
    lb_relacao_vh['text'] = "Verificando a relação vão/altura."
    sleep(1)
    lb_relacao_vh['text'] = "Verificando a relação vão/altura.."
    sleep(1)
    lb_relacao_vh['text'] = "Verificando a relação vão/altura..."
    sleep(1)

    if a > b:
        lb_relacao_vh['fg'] = 'red'
        lb_relacao_vh['text'] = 'Verificando a relação vão/altura...ERRO!'
    else:
        lb_relacao_vh['fg'] = 'green'
        lb_relacao_vh['text'] = 'Verificando a relação vão/altura...OK!'


# Executando o método em um thead do processador diferente daquele onde está o loop da janela.
threading.Thread(target=verificar_altura, daemon=True).start()

# Loop que fica repetindo a janela (FPS).
janela.mainloop()

If this is not the idea, you will be commenting so we can refine the code or even find other possibilities.

    
29.08.2018 / 18:23