[ Foro de Python ]

Problema con programa tkinter

06-Sep-2015 21:32
Invitado (Daniel)
0 Respuestas

Hola!

Quiero crear una cuenta atrás con interfaz gráfica en Python. Pero no sé como hacer para que la funcion cuentaatras actualice las labels. Ahora mismo al ejecutar la función la ventana v1a se queda bloqueada hasta que termine la función.

CODIGO:

from tkinter import *
from time import *
from tkinter.messagebox import *

def mostrar(v): v.deiconify()
def ocultar(v): v.withdraw()
def ejecutar(f): v1.after(200,f)

def cuentaatras(_h,_m,_s):
   x = True
   try:
       h = int(_h.get())
       m = int(_m.get())
       s = int(_s.get())
       while (x==True):
           _h.set(h)
           _m.set(m)
           _s.set(s)
           print(str(h)+":"+str(m)+":"+str(s))#Test
           if s==0 and m!=0:
               sleep(1)
               s=60
               m-=1
               print(str(h)+":"+str(m)+":"+str(s))#Test
           elif s==0 and m==0 and h!=0:
               sleep(1)
               s=60
               m=60
               h-=1
               print(str(h)+":"+str(m)+":"+str(s))#Test
           elif s==0 and m==0 and h==0:
               x=False
           sleep(1)
           s-=1
   except ValueError:
       v1a.withdraw()
       showerror("Rellena todos los campos","Rellena los campos con 0 para que sean invalidos")

#ventana cuenta atrás
v1 = Tk()
v1.title("Cuenta atrás")
v1.resizable(0,0)
f1=Frame(v1)
f1.grid(column=0,row=0,padx=(10,10),pady=(10,10))

#ventana cuenta atrás 2
v1a = Toplevel(v1)
v1a.title = v1.title
v1a.resizable(0,0)
v1a.withdraw()

#Elementos Cuenta atrás
   #Labels
LEnCA = Label(f1,text="Introduce el tiempo que quieras contar.").grid(column=1,row=1,columnspan=3,pady=(0,5))
Lh1 = Label(f1,text="Horas:").grid(column=1,row=2)
Lm1 = Label(f1,text="Minutos:").grid(column=2,row=2)
Ls1 = Label(f1,text="Segundos:").grid(column=3,row=2)

   #Entradas
Eh = StringVar()
Ehoras = Entry(f1,width=5,textvar=Eh).grid(column=1,row=3)
Em = StringVar()
Eminutos = Entry(f1,width=5,textvar=Em).grid(column=2,row=3)
Es = StringVar()
Esegundos = Entry(f1,width=5,textvar=Es).grid(column=3,row=3)
   #Botones
Bstart1 = Button(f1,text="Start",command=lambda:ejecutar(mostrar(v1a)or (cuentaatras(Eh,Em,Es)))).grid(column=4,row=3)
Bcerrar1= Button(f1,text="Cerrar",command=lambda:ejecutar(ocultar(v1))).grid(column=2,row=4)

#Elementos Cuenta atrás 2
   #Labels
h3 = StringVar()
Lh3 = Label(v1a,text=h3).grid(column=1,row=2)
m3 = StringVar()
Mh3 =Label(v1a,text=m3).grid(column=2,row=2)
s3 = StringVar()
Ls3 = Label(v1a,text=s3).grid(column=3,row=2)
   #Botones
Bparar = Button(v1a,text="Parar",command=()).grid(column=4,row=2)
Bcerrar1= Button(v1a,text="Cerrar",command=lambda:ejecutar(ocultar(v1a))).grid(column=2,row=3)
v1.mainloop()

Muchas gracias.




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)