Tkinter, inhabilitar widgets mientras procesa el script [PYTHON]

Iniciado por Yidu, 30 Diciembre 2017, 19:19 PM

0 Miembros y 1 Visitante están viendo este tema.

Yidu

Hola de nuevo!

He leído algo sobre el uso de while con tkinter. Osea, que no se llevan muy bien. Por el tema que se congela la GUI. Aunque también ocurre cuando se realizan cálculos que tardan.

Me he informado un poco y veo que se suelen usar los hilos o threads para evitar estos problemas.

La cosa, es, que tenia realizado un pequeño programa en consola. Y me hacia gracia retocarlo con tkinter. Osea, que los resultados e impresiones ya no fueran por consola, si no por la GUI.

Al entrar por primera vez al programa, este, realiza unos cálculos. En ese caso la consola se quedaba a la espera. Cuando realizaba la tarea, mostraba los resultados. Hasta ahí, todo bien.

Con tkinter cree un boton para realizar esos calculos. Y entonces es cuando se congela. Cosa que no me importa. Ya que con el resultado de ellos, he de trabajar luego. Es decir, no me importa esperar. Lo que no quiero es que al tocar otro botón de la GUI (mientra realiza los calculos) ponga el nefasto mensaje de 'no responde'.

La idea es, si en tkinter, hay alguna forma de inhabilitar los widgets y que así no de la opción a ese mensaje de 'programa no responde'. Y cuando el script acabe los cálculos, los widgets estén operativos.

No se si me explico. La idea no es trabajar en multiproceso o varias tareas a la vez. En vez de eso, que no podamos tocar nada mientras hacemos dichos cálculos.

Con este simple script (mientras en consola se va imprimiendo) si nos da por tocar el botón de nuevo o clicar en la ventana, la GUI se congela ¿Se puede inhabilitar mientras se imprime en la consola? (esto solo es un ejemplo)

Código (python) [Seleccionar]
from tkinter import Tk, Button


ventana = Tk()
ventana.geometry('300x300+100+100')

def cuenta():
   
    for i in range(1, 100000):
        print(i)     
       
       
btn = Button(ventana, text = 'Pulsa', command = cuenta)
btn.place(x = 10, y = 10)


ventana.mainloop()


Gracias!

tincopasan

como no te han respondido te daré mi bruta opinión:
Código (python) [Seleccionar]

#-*- coding:utf -8 -*-
from tkinter import *
import threading

def cuenta():
    btn.config(state="disabled") # con esto obviamente dejo inusable el botón
    def hace():
        for i in range(1, 100000):
            print(i)
       
        btn.config(state="normal")#seguro adivinas que hace esto
           
    t = threading.Thread(target=hace) #no conozco otra forma sin threads, pero me disculpo porque hace años que no uso tkinter.
    t.start()
   
ventana = Tk()
ventana.geometry('300x300+100+100')

btn = Button(ventana, text = 'Pulsa', command = cuenta)
btn.place(x = 10, y = 10)


ventana.mainloop()


como ves se pueden deshabilitar los widgets(botones en este caso), pero en mi poca experiencia no sé si se puede hacer lo que buscas sin threads.(igual no veo porque no usarlos, para eso están)
Saludos.