Problemas Entry Tkinter

Christal Berengena Moreno se05216 en salleURL.edu
Jue Jul 1 12:54:59 CEST 2004


Hola,

Gracias por tus consejos sobre como hacer mas legible mi codigo...los
tendre en cuenta! es que cuando llevas mas de 6000 lineas de codigo ya no
se que poner en los nombres de las cosas... :P

He probado tu codigo, me he instalado el python 2.3.3 y parece que siempre
funciona, genial! :)

La unica cosa que veo es que con el grab_set, el usuario puede cerrar mi
aplicacion simplemente pulsando a la X y yo eso he de controlarlo, o como
minimo he de saber cuando lo esta haciendo para actuar al respecto... he
estado mirando la libreria de tkinter pero no logro encontrar ninguna de
las opciones que hay que me permita eliminar esta opcion (la X) o
controlar cuando la pulsan o no... por eso opte or utilizar el
overrideredirect. En mi aplicacion el usuario no accede al escritorio...
de hecho, al iniciar e PC va directamente a ella y no puede salir a no ser
que tenga la contrase¤a adecuada... asi que he de controlar este punto...
sabes/sabeis alguna manera de controlar esto que no sea con
overrideredirect? estoy abierta a cualquier sugerencia...

Muchisimas gracias!!
Christal

On Wed, 30 Jun 2004, Ernesto Revilla wrote:


> 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
> >
> >
> >
>
> _______________________________________________
> 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