Autor
|
Tema: Que todos los entry dentro de un frame sean readonly en tkinter. (Leído 5,359 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 tk import Funciones from tkinter import ttk from functools import partial from 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.841
🔵🔵🔵🔵🔵🔵🔵
|
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ón con 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.841
🔵🔵🔵🔵🔵🔵🔵
|
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 tk from 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
Scripting
|
AdeLax
|
0
|
2,868
|
5 Agosto 2013, 18:46 pm
por AdeLax
|
|
|
Meter un Frame dentro de otro Frame
« 1 2 3 4 »
Java
|
kikian94
|
34
|
18,549
|
28 Marzo 2015, 12:47 pm
por kikian94
|
|
|
Rellenar una caja de tkinter "Entry" sin botones
Scripting
|
PUAROT
|
4
|
4,539
|
14 Julio 2016, 00:28 am
por PUAROT
|
|
|
Tkinter UI de python 3.x, ayuda con Entry
Scripting
|
royer14
|
2
|
3,099
|
8 Noviembre 2017, 13:38 pm
por royer14
|
|
|
Obtener contenido de todos los entry tkinter
Scripting
|
SlayerBur
|
4
|
4,980
|
26 Septiembre 2022, 18:50 pm
por SlayerBur
|
|