| 
	
		|  Autor | Tema: Que todos los entry dentro de un frame sean readonly en tkinter.  (Leído 6,725 veces) |  
	| 
			| 
					
						| El mas antiguo 
								
								 Desconectado 
								Mensajes: 103
								
								   | 
 
Bueno, eso, tengo 7 entrys dentro de un frame y quisiera que sean todos de solo lectura hasta que se pulse el botón <Agregar>, es bastante tedioso tener que cambiar el estado de cada uno cada vez que se quieran editar.- Encontré por allí una manera de hacerlo con un bucle for, pero no me convenció.- Les dejo el programa por si alguien necesita correrlo…  import tkinter as tkimport Funcionesfrom tkinter import ttkfrom functools import partialfrom idlelib.tooltip import Hovertip def centrarVentana(root):    w = 430    h = 375     ws = root.winfo_screenwidth()    hs = root.winfo_screenheight()    x = (ws/2) - (w/2)    y = (hs/2) - (h/2)    root.geometry('%dx%d+%d+%d' % (w, h, x, y)) def main():    servicios = tk.Tk()    servicios.title(" Servicios.")    centrarVentana(servicios)     # Mensajes(label)     mensaje_mes = tk.Label(servicios, text="Mes", font=("Vardana", 12))    mensaje_mes.place(x=15, y=10)     # Llenar el Combobox de los meses.    meses = Funciones.meses_()     # Llenar combo MES y seleccionar el MES actual.    combo_mes = ttk.Combobox(servicios, state="readonly",        width=9, font=("Verdana", 11), values=meses[0])    combo_mes.place(x=60, y=10)    combo_mes.bind("<<ComboboxSelected>>")         combo_mes.set(meses[1])     mensaje_anio = tk.Label(servicios, text="Año", font=("Vardana", 12))    mensaje_anio.place(x=15, y=50)     combo_mes.set(meses[1])          anio = Funciones.anios_()     # Llenar combo AÑO y seleccionar el AÑO actual.    combo_anio = ttk.Combobox(servicios, state="readonly",        width=9, font=("Verdana", 11), values=anio[0])    combo_anio.place(x=60, y=50)    combo_anio.bind("<<ComboboxSelected>>")         combo_anio.set(anio[1])     # Frame para contener los botones    caja_entrys = tk.Frame(servicios)    caja_entrys.place(x=5, y=85)    caja_entrys.config(width="416", height="213")    caja_entrys.config(bd=5)    caja_entrys.config(relief="ridge")     mensaje_epe = tk.Label(caja_entrys,             text="E.P.E - Factura......$                                Kwh....$",             font=("Vardana", 12))    mensaje_epe.place(x=5, y=10)     mensaje_gas = tk.Label(caja_entrys,             text="Gas - Factura.........$                                M3......$",             font=("Vardana", 12))    mensaje_gas.place(x=5, y=50)     mensaje_comuna = tk.Label(caja_entrys, text="Comuna..................$",            font=("Vardana", 12))    mensaje_comuna.place(x=5, y=90)     mensaje_ceodal = tk.Label(caja_entrys, text="Ceodal....................$",            font=("Vardana", 12))    mensaje_ceodal.place(x=5, y=130)     mensaje_cable = tk.Label(caja_entrys, text="Cable Max..............$",            font=("Vardana", 12))    mensaje_cable.place(x=5, y=170)     # Entradas(E.P.E-Factura)         entrada_epe_monto = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)    entrada_epe_monto.place(x=155, y=10)     # Entradas(E.P.E-Kwh)         entrada_epe_kwh = tk.Entry(caja_entrys, font=("Vardana", 12), width=5)    entrada_epe_kwh.place(x=335, y=10)     # Entrada(Gas- Factura)         entrada_gas_monto = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)    entrada_gas_monto.place(x=155, y=50)     # Entradas(Gas- M3)         entrada_gas_M3 = tk.Entry(caja_entrys, font=("Vardana", 12), width=5)    entrada_gas_M3.place(x=335, y=50)     # Entrada(Comuna)         entrada_comuna = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)    entrada_comuna.place(x=155, y=90)     # Entrada(Ceodal)         entrada_ceodal = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)    entrada_ceodal.place(x=155, y=130)     # Entrada(Cable)         entrada_cable = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)    entrada_cable.place(x=155, y=170)     # Frame para contener los botones    caja_botones = tk.Frame(servicios)    caja_botones.place(x=5, y=305)    caja_botones.config(width="416", height="60")    caja_botones.config(bd=5)    caja_botones.config(relief="ridge")     # Botón Agregar    texto = ''' Agregar movimiento,no olvide seleccionar la fecha correcta... '''    boton_agregar = ttk.Button(caja_botones, text="Agregar",              command=partial(Funciones.agregar, caja_botones))    boton_agregar.place(x=5, y=5, width=80, height=40)    hovertip = Hovertip(boton_agregar, texto)     # Botón Estadisticas    boton_estad = ttk.Button(caja_botones, text="Estadisticas",              command=partial(Funciones.estadisticas))    boton_estad.place(x=95, y=5, width=80, height=40)    hovertip = Hovertip(boton_estad, ' Estadisticas de servicios ')     # Botón Cerrar    boton_cerrar = ttk.Button(caja_botones, text="Cerrar",              command=servicios.destroy)    boton_cerrar.place(x=320, y=5, width=80, height=40)    hovertip = Hovertip(boton_cerrar, ' Cerrar aplicación. ')     servicios.mainloop()  if __name__ == '__main__':    main() 
 from datetime import datetime def meses_():    meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",             "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]     now = datetime.now()    mes = now.month    actual = meses[mes-1]     return meses, actual def anios_():    años = ["2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017",             "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025",             "2026", "2027", "2028", "2029", "2030", "2031", "2032", "2033"]     now = datetime.now()    actual = now.year     return años, actual def agregar(caja_botones):    caja_botones.place_forget() def estadisticas():    print("estadisticas") 
 Desde ya muchas gracias y que tengan todos un lindo jueves... Slds. Daniel ☕☕☕
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Danielㅤ 
								       
								
								 Desconectado 
								Mensajes: 1.912
								
								 
								🔵🔵🔵🔵🔵🔵🔵
								
								
								
								
								
								   | 
 
Hola, es muy mala práctica usar la palabra "años" como nombre de variable, en su lugar se debe utilizar "años", no se como el intérprete no te dio error. años Saludos  PD: Ohh vaya el foro tiene un corrector ortográfico:  Si escribo anios  se transforma en años . 
 
 |  
						| 
								|  |  
								| « Última modificación: 20 Octubre 2022, 19:49 pm por Danielㅤ » |  En línea | 
 
 |  |  |  | 
			| 
					
						| El mas antiguo 
								
								 Desconectado 
								Mensajes: 103
								
								   | 
 
¿Hola, me podrías decir en que contribuye lo que escribiste en relacióncon lo que estoy pidiendo ayuda?, gracias…
 En ningún momento declararía el identificador de una variable de esa
 manera, desconozco como actúa el corrector del foro y además no
 me concierne.-
 
 Slds. Daniel ☕☕☕
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| Danielㅤ 
								       
								
								 Desconectado 
								Mensajes: 1.912
								
								 
								🔵🔵🔵🔵🔵🔵🔵
								
								
								
								
								
								   | 
 
Estimado mas antiguo te invito a que leas nuevamente mi anterior mensaje para que lo entiendas mejor, pero de igual manera te lo explico   En mi post anterior te había comentado que no era buena práctica el usar una letra "ñ" en los nombres de las variables y que me pareció raro que tu código funcionara sin que el intérprete te muestre algún error, pero al responder tu post me di cuenta que el foro hace una corrección de de una palabra por otra, tal como deje explicado en mi anterior respuesta e incluso con una imagen mostrando la corrección que el mismo foro hace automáticamente. Por lo que me di cuenta que seguramente no has usado la letra ñ en el nombre de la variable de los años y de hecho en tu última respuesta lo confirmas. Sólo era eso. Desde ya muchas gracias y que tengan todos un lindo jueves...
 Muchas gracias e igualmente    Saludos |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| El mas antiguo 
								
								 Desconectado 
								Mensajes: 103
								
								   | 
 
Bueno, ya quedo todo claro, esto me anima a preguntarte,¿me podés decir si es posible lo que intento?, gracias, abrazo.-
 
 Slds. Daniel ☕☕☕
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  | 
			| 
					
						| El mas antiguo 
								
								 Desconectado 
								Mensajes: 103
								
								   | 
 
Gracias Dani, dejo lo que logre, para ayudarlos a entender, les aclaro que todas las veces que necesito pasar muchos parámetros a las funciones los pongo a todos en una lista y este es el código.-     # lista para pasar los parametros a funciones.    parametros = []    parametros.append(servicios)          #  [0] Ventana    parametros.append(combo_mes)          #  [1] Mes.    parametros.append(combo_anio)         #  [2] Año.    parametros.append(caja_entrys)        #  [3] Frame Label y Entrys.    parametros.append(entrada_epe_monto)  #  [4] EPE monto.    parametros.append(entrada_epe_kwh)    #  [5] EPE kwh.    parametros.append(entrada_gas_monto)  #  [6] GAS monto.    parametros.append(entrada_gas_M3)     #  [7] GAS M3.    parametros.append(entrada_comuna)     #  [8] Comuna.    parametros.append(entrada_ceodal)     #  [9] Ceodal.    parametros.append(entrada_cable)      # [10] Cable Max.    parametros.append(caja_botones)       # [11] Frame botones.
 def agregar(parametros):    parametros[11].place_forget()     # Activar todos los entrys.    indice = 4    while indice < 11:        parametros[indice].config(state=tk.NORMAL)        indice += 1
 Slds. Daniel ☕☕☕ |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| reymosquito 
								
								 Desconectado 
								Mensajes: 81
								
								
								
								
								
								   | 
 
Encontré por allí una manera de hacerlo con un bucle for, pero no me convenció.- No tengo idea que manera encontraste, porque no la pusiste, pero desde ya te digo que la única manera viable es con un ciclo ¿sino como recorres cada elemento del frame? |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| El mas antiguo 
								
								 Desconectado 
								Mensajes: 103
								
								   | 
 
Que paso rey, tanto esperar tu código que nunca apareció jajajajaja.-Te respondo, tenés que considerar que hay cosas que vos das por sentadas
 por tus vastos conocimientos, yo recién me inicio y hay cosas que ni
 utilizando el criterio aplicado al lenguaje me cae la ficha,-
 En cuanto al código que encontré en otro foro era un for y tenía más líneas
 que si tratara los entry uno a uno.-
 
 Slds. Daniel ☕☕☕
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| reymosquito 
								
								 Desconectado 
								Mensajes: 81
								
								
								
								
								
								   | 
 
bueno, no voy a usar tu código tal cual, solo modifico y copio algunas cosas para dejarlo funcional y mostrarte como lo haría: #-*- coding:utf-8 -*-import tkinter as tkfrom tkinter import ttk  LETRA = ("Vardana", 12) class Ventana:    def __init__(self,principal):        self.principal = principal        self.apariencia()        self.bloquear()     def apariencia(self):        self.contenedor = tk.Frame(self.principal)        self.contenedor.place(x=5, y=85)        self.contenedor.config(width="416", height="213")        self.contenedor.config(bd=5)        self.contenedor.config(relief="ridge")        mensaje_epe = tk.Label(self.contenedor,text="E.P.E - Factura......$\t\t             Kwh....$",font=LETRA)        mensaje_epe.place(x=5, y=10)        mensaje_gas = tk.Label(self.contenedor,text="Gas - Factura.........$\t\t             M3......$",font=LETRA)        mensaje_gas.place(x=5, y=50)        mensaje_comuna = tk.Label(self.contenedor, text="Comuna..................$",font=LETRA)        mensaje_comuna.place(x=5, y=90)        mensaje_ceodal = tk.Label(self.contenedor, text="Ceodal....................$", font=LETRA)        mensaje_ceodal.place(x=5, y=130)        mensaje_cable = tk.Label(self.contenedor, text="Cable Max..............$",font=LETRA)        mensaje_cable.place(x=5, y=170)         entrada_epe_monto = tk.Entry(self.contenedor, font=(LETRA), width=10)        entrada_epe_monto.place(x=155, y=10)        entrada_epe_kwh = tk.Entry(self.contenedor, font=(LETRA), width=5)        entrada_epe_kwh.place(x=335, y=10)        entrada_gas_monto = tk.Entry(self.contenedor, font=(LETRA), width=10)        entrada_gas_monto.place(x=155, y=50)        entrada_gas_M3 = tk.Entry(self.contenedor, font=(LETRA), width=5)        entrada_gas_M3.place(x=335, y=50)        entrada_comuna = tk.Entry(self.contenedor, font=(LETRA), width=10)        entrada_comuna.place(x=155, y=90)        entrada_ceodal = tk.Entry(self.contenedor, font=(LETRA), width=10)        entrada_ceodal.place(x=155, y=130)        entrada_cable = tk.Entry(self.contenedor, font=(LETRA), width=10)        entrada_cable.place(x=155, y=170)                  caja_botones = tk.Frame(self.principal)        caja_botones.place(x=5, y=305)        caja_botones.config(width="416", height="60")        caja_botones.config(bd=5)        caja_botones.config(relief="ridge")         boton_agregar = ttk.Button(caja_botones, text="Agregar",command=self.desbloquear)        boton_agregar.place(x=5, y=5, width=80, height=40       )        def bloquear(self):        for x in range(5,12):            self.contenedor.winfo_children()[x].config(state= "readonly")     def desbloquear(self):        for x in range(5,12):            self.contenedor.winfo_children()[x].config(state= "normal")         def centrar_Ventana(root):    w = 430    h = 375    ws = root.winfo_screenwidth()    hs = root.winfo_screenheight()    x = (ws/2) - (w/2)    y = (hs/2) - (h/2)    root.geometry('%dx%d+%d+%d' % (w, h, x, y))         def  inicial():    raiz=tk.Tk()    raiz.title(" Servicios.")    centrar_Ventana(raiz)        ventana=Ventana(raiz)    mensaje_mes = tk.Label(raiz, text="Mes", font=(LETRA))    mensaje_mes.place(x=15, y=10)        raiz.mainloop() if __name__=='__main__':    inicial()  
 Edito:  Dicho sea de paso, veo que estás intentando hacer aplicaciones mejores, por lo que te recomendaría dos cosas: 1) empezá a usar clases 2) tkinter sirve pero para aplicaciones de más nivel(y de menos también) es mejor aprender pyqt5 , si bien está pyqt6, todavía no encontré muchos ejemplos para que se puedan seguir, así que es solo siguiendo la documentación, en cambio pyqt5 está plagado de ejemplos. |  
						| 
								|  |  
								| « Última modificación: 21 Octubre 2022, 21:51 pm por reymosquito » |  En línea | 
 
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | [Python\Tkinter]Marcar limites a un listbox o frame Python
 | AdeLax | 0 | 3,338 |  5 Agosto 2013, 18:46 pm por AdeLax
 |  
						|   |   | Meter un Frame dentro de otro Frame
							« 1 2 3 4 » Java
 | kikian94 | 34 | 19,819 |  28 Marzo 2015, 12:47 pm por kikian94
 |  
						|   |   | Rellenar una caja de tkinter "Entry" sin botones Scripting
 | PUAROT | 4 | 4,915 |  14 Julio 2016, 00:28 am por PUAROT
 |  
						|   |   | Tkinter UI de python 3.x, ayuda con Entry Scripting
 | royer14 | 2 | 3,401 |  8 Noviembre 2017, 13:38 pm por royer14
 |  
						|   |   | Obtener contenido de todos los entry tkinter Scripting
 | SlayerBur | 4 | 5,762 |  26 Septiembre 2022, 18:50 pm por SlayerBur
 |    |