Problemas Entry Tkinter
Ernesto Revilla
erny en sicem.biz
Mie Jun 30 19:43:19 CEST 2004
Hola,
a mi me funciona (python 2.3.3). Cada vez que le doy a 'INSERTAR
NOMBRE', me deja escribir un nombre sin problema.
Pero, no es la manera de hacer ventanas modales, la verdad. De hecho, al
poner otra aplicación delante, ya no puedo acceder a la ventana, porque
no hay ventana. El overrideredirect(1) pasa de largo al sistema de
ventanas. Nosotros lo usamos para crear combos u otros controles que
queremos no sean manejados por el sistema de ventanas. Para hacer
cuadros modales, mejor usa w.grab_set() (cuadro modal a la aplicación)
o w.grab_set_global() (cuadro modal a todo el escritorio).
(Para quitarlo, usa w.grab_release())
He cambiado un poco tu código, con el objetivo de hacerlo más legible.
Cabe destacar lo siguiente:
* se guardan solamente self.varNombre y self.ventana, las demás
referencias no hace falta guardarlas en self.
* los métodos de clase, normalmente son verbos y empiezan en minúscula,
como crearVentana
* los comandos de botón empiezan por cmd y siguen con un verbo, como
cmdCambiarNombre
* he usado ventana.grab_set() y en cerrarVentana:
ventana.grab_release() para hacer la ventana modal (respecto a la
aplicación).
* en botón de salida de aplicación activa root.quit en vez de root.destroy.
Saludos, Erny
# -*- encoding: latin1 -*-
from Tkinter import *
import string
class Molde:
def __init__(self,parent):
self.raiz=parent
self.crearVentana()
def crearVentana(self):
ventana=Toplevel(self.raiz, bg='#908875', borderwidth=3,
relief='raised')
ventana.geometry('400x300+250+100')
self.ventana=ventana # guardar ventana, para poder destruirla
luego.
frame=Frame(ventana, bg='#e7dfca', borderwidth=3, relief='sunken')
frame.place(relx=0.005, rely=0.015, relh=0.97, relw=0.99)
lbl=Label(frame,bg='#e7dfca', text="NUEVO NOMBRE",
font=('arial','16','bold'))
lbl.place(relx=0.05, rely=0.25)
var=StringVar(ventana)
var.set("nuevo")
self.varNombre=var # tenemos que acceder más tarde.
entry=Entry(ventana, bg='white', font=('arial','18','bold'),
textvariable=var)
entry.place(relx=0.05, rely=0.4)
entry.focus()
btn=Button(frame, bg='#908875', fg='white', text="OK",
font=('arial','16','bold'), command=self.cmdCambiarNombre)
btn.place(relx=0.3, rely=0.65, relh=0.15, relw=0.25)
btn=Button(frame, bg='#908875', fg='white', text="SALIR",
font=('arial','16','bold'),command=self.cmdSalirVentana)
btn.place(relx=0.6, rely=0.65, relh=0.15, relw=0.25)
ventana.grab_set()
def cmdCambiarNombre(self):
nombre=self.varNombre.get()
print "nombre es: %s" % nombre
if nombre=='':
pass
elif len(nombre)>15:
pass
else:
print "nombre cambiado"+nombre
self.cerrarVentana()
def cmdSalirVentana(self):
self.cerrarVentana()
def cerrarVentana(self):
self.ventana.grab_release()
self.ventana.destroy()
if __name__ == '__main__':
root=Tk()
root.geometry("200x100+400+300")
# root.overrideredirect(1)
btn=Button(root,text="INSERTAR NOMBRE",bg="blue",command=lambda
parent=root: Molde(parent))
btn.pack(side=TOP, fill=BOTH, expand=YES)
btn=Button(root,text="SALIR",bg="orange",command=root.quit)
btn.pack(side=TOP, fill=BOTH, expand=YES)
root.mainloop()
Christal Berengena Moreno escribió:
>He hecho un "codigo de muestra" con el problema... en este tambien me pasa
>lo mismo...
>from Tkinter import *
>import string
>
>root=Tk()
>
>class Molde:
> def __init__(self,parent):
> self.raizppal=parent
> self.CambiaNombreMolde()
>
> def CambiaNombreMolde(self):
> self.frNombreMolde2=Toplevel(self.raizppal, bg='#908875',
>borderwidth=3, relief='raised')
> self.frNombreMolde2.geometry('400x300+250+100')
> self.frNombreMolde2.overrideredirect(1)
>
> self.frNombreMolde=Frame(self.frNombreMolde2,
>bg='#e7dfca', borderwidth=3, relief='sunken')
> self.frNombreMolde.place(relx=0.005, rely=0.015,
>relh=0.97, relw=0.99)
>
>
>self.LblEntryNombreMolde=Label(self.frNombreMolde,bg='#e7dfca',
> text="NUEVO NOMBRE",
>font=('arial','16','bold'))
> self.LblEntryNombreMolde.place(relx=0.05, rely=0.25)
> self.entryVarNombreMolde=StringVar()
> self.entryVarNombreMolde.set("nuevo")
> self.EntryNombreMolde=Entry(self.frNombreMolde, width=30,
>bg='white', font=('arial','18','bold'),
>
>textvariable=self.entryVarNombreMolde)
> self.EntryNombreMolde.place(relx=0.05, rely=0.4)
> #~ self.EntryNombreMolde.focus()
>
> self.btnSalvarNombreMolde=Button(self.frNombreMolde,
>bg='#908875', fg='white',
> text="OK", font=('arial','16','bold'),
>command=self.cmdBtnOKNombreMolde)
> self.btnSalvarNombreMolde.place(relx=0.3, rely=0.65,
>relh=0.15, relw=0.25)
>
> self.btnSalirNombreMolde=Button(self.frNombreMolde,
>bg='#908875', fg='white',
> text="SALIR", font=('arial','16','bold'),
>command=self.frNombreMolde2.destroy)
> self.btnSalirNombreMolde.place(relx=0.6, rely=0.65,
>relh=0.15, relw=0.25)
>
> def cmdBtnOKNombreMolde(self):
> self.NombreMolde=self.entryVarNombreMolde.get()
> if self.NombreMolde=='':
> pass
> elif len(self.NombreMolde)>15:
> pass
> else:
> print "molde cambiado"+self.NombreMolde
> self.frNombreMolde2.destroy()
>
> def cmdBtnSalirMolde(self):
> self.frNombreMolde2.destroy()
>
>if __name__ == '__main__':
> root.geometry("200x100+400+300")
> root.overrideredirect(1)
>
> btnNombre=Button(root,text="INSERTAR
>NOMBRE",bg="blue",command=lambda parent=root: Molde(parent))
> btnNombre.pack(side=TOP, fill=BOTH, expand=YES)
>
>
>btnSalir=Button(root,text="SALIR",bg="orange",command=root.destroy)
> btnSalir.pack(side=TOP, fill=BOTH, expand=YES)
>
> root.mainloop()
>
>
>On Tue, 29 Jun 2004, Ernesto Revilla wrote:
>
>
>
>>Con más código nos ayudarías:
>>
>>* estás ejecutando el mainloop() al final del programa? SI
>>
>>* estáis creando los Entries cada vez de nuevo? Los StringVars también?
>>
>>
>SI, SE SOBREESCRIBEN CADA VEZ QUE ENTRO...
>
>
>>* qué se utiliza para cerrar la ventana? DESTRUYO EL FRAME PRINCIPAL DE
>>
>>
>LA MISMA (EL QUE CONTIENE TODOS LOS ENTRY), TAMBIEN HE INTENTADO DESTRUIR
>OBJETO A OBJETO Y HACE LO MISMO...
>
>
>>...
>>Erny
>>
>>
>
>SI NECESITAIS MAS... DECIDLO QUE OS ENVIO MAS, PERO NO SE QUE PUEDE SER!
>HE PROBADO TAMBIEN PONER LO DEL FOCUS PARA ACTIVARLO Y NADA...
>
>GRACIAS!!
>
>
>
>
>>Christal Berengena Moreno escribió:
>>
>>
>>
>>>Hola a todos!
>>>
>>>Os explico un poco nuestro problema para ver si alguien sabe a que puede
>>>ser debido...
>>>Tenemos un programa en python que en ciertas ocasiones solicita
>>>informacion del usuario mediante "entry" de tkinter... hasta aqui todo
>>>bien... Lo especial en nuestro problema es que solo nos permite acceder a
>>>la parte de entrada del entry, solo nos aparece en cursor para introducir
>>>datos, la primera vez que abrimos el toplevel que contiene el entry...
>>>Nos pasa en todos los entrys y no sabemos que es lo que puede causar
>>>esto... parece como si el entry tubiera un "tope" en una especie de buffer
>>>y se llenara, pero es que cada vez que cerramos el toplevel lo destruimos
>>>todo y al abrirlo de nuevo se genera otra vez...
>>>
>>>El codigo que utilizamos para generarlo es este...
>>>
>>>self.entryVarNombreMolde=StringVar()
>>>self.entryVarNombreMolde.set(self.InterfazGeneral.valoresMaqs[self.nummaq].TxtCaractMoldeAct[0])
>>>self.EntryNombreMolde=Entry(self.frNombreMolde, width=30,
>>> bg='white', font=('arial','18','bold'),
>>> textvariable=self.entryVarNombreMolde)
>>>self.EntryNombreMolde.place(relx=0.05, rely=0.4)
>>>
>>>Luego, al leerlo siempre usamos self.entryVarNombreMolde.get(), pero eso
>>>no nos da problemas...
>>>
>>>Si alguien tiene idea de como se puede solucionar o hay alguna otra manera
>>>de introducir datos... que no dude en decirnoslo!!
>>>
>>>Un saludo y gracias!!!!!
>>>Y si necesitais que os explique mas para poder ayudarnos... no hay
>>>problema... otra vez gracias!! :)
>>>
>>>
>>>------------------------------------------------------------------------
>>>
>>>_______________________________________________
>>>Python-es mailing list
>>>Python-es en aditel.org
>>>http://listas.aditel.org/listinfo/python-es
>>>
>>>
>>>
>>>
>>_______________________________________________
>>Python-es mailing list
>>Python-es en aditel.org
>>http://listas.aditel.org/listinfo/python-es
>>
>>
>>
>
>_______________________________________________
>Python-es mailing list
>Python-es en aditel.org
>http://listas.aditel.org/listinfo/python-es
>
>
>
Más información sobre la lista de distribución Python-es