elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Que todos los entry dentro de un frame sean readonly en tkinter.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Que todos los entry dentro de un frame sean readonly en tkinter.  (Leído 4,762 veces)
El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Que todos los entry dentro de un frame sean readonly en tkinter.
« en: 20 Octubre 2022, 16:40 pm »

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…

Código
  1. import tkinter as tk
  2. import Funciones
  3. from tkinter import ttk
  4. from functools import partial
  5. from idlelib.tooltip import Hovertip
  6.  
  7. def centrarVentana(root):
  8.    w = 430
  9.    h = 375
  10.  
  11.    ws = root.winfo_screenwidth()
  12.    hs = root.winfo_screenheight()
  13.    x = (ws/2) - (w/2)
  14.    y = (hs/2) - (h/2)
  15.    root.geometry('%dx%d+%d+%d' % (w, h, x, y))
  16.  
  17. def main():
  18.    servicios = tk.Tk()
  19.    servicios.title(" Servicios.")
  20.    centrarVentana(servicios)
  21.  
  22.    # Mensajes(label)
  23.    mensaje_mes = tk.Label(servicios, text="Mes", font=("Vardana", 12))
  24.    mensaje_mes.place(x=15, y=10)
  25.  
  26.    # Llenar el Combobox de los meses.
  27.    meses = Funciones.meses_()
  28.  
  29.    # Llenar combo MES y seleccionar el MES actual.
  30.    combo_mes = ttk.Combobox(servicios, state="readonly",
  31.        width=9, font=("Verdana", 11), values=meses[0])
  32.    combo_mes.place(x=60, y=10)
  33.    combo_mes.bind("<<ComboboxSelected>>")    
  34.  
  35.    combo_mes.set(meses[1])
  36.  
  37.    mensaje_anio = tk.Label(servicios, text="Año", font=("Vardana", 12))
  38.    mensaje_anio.place(x=15, y=50)
  39.  
  40.    combo_mes.set(meses[1])    
  41.  
  42.  
  43.    año = Funciones.anios_()
  44.  
  45.    # Llenar combo AÑO y seleccionar el AÑO actual.
  46.    combo_anio = ttk.Combobox(servicios, state="readonly",
  47.        width=9, font=("Verdana", 11), values=año[0])
  48.    combo_anio.place(x=60, y=50)
  49.    combo_anio.bind("<<ComboboxSelected>>")    
  50.  
  51.    combo_anio.set(año[1])
  52.  
  53.    # Frame para contener los botones
  54.    caja_entrys = tk.Frame(servicios)
  55.    caja_entrys.place(x=5, y=85)
  56.    caja_entrys.config(width="416", height="213")
  57.    caja_entrys.config(bd=5)
  58.    caja_entrys.config(relief="ridge")
  59.  
  60.    mensaje_epe = tk.Label(caja_entrys,
  61.             text="E.P.E - Factura......$                                Kwh....$",
  62.             font=("Vardana", 12))
  63.    mensaje_epe.place(x=5, y=10)
  64.  
  65.    mensaje_gas = tk.Label(caja_entrys,
  66.             text="Gas - Factura.........$                                M3......$",
  67.             font=("Vardana", 12))
  68.    mensaje_gas.place(x=5, y=50)
  69.  
  70.    mensaje_comuna = tk.Label(caja_entrys, text="Comuna..................$",
  71.            font=("Vardana", 12))
  72.    mensaje_comuna.place(x=5, y=90)
  73.  
  74.    mensaje_ceodal = tk.Label(caja_entrys, text="Ceodal....................$",
  75.            font=("Vardana", 12))
  76.    mensaje_ceodal.place(x=5, y=130)
  77.  
  78.    mensaje_cable = tk.Label(caja_entrys, text="Cable Max..............$",
  79.            font=("Vardana", 12))
  80.    mensaje_cable.place(x=5, y=170)
  81.  
  82.    # Entradas(E.P.E-Factura)    
  83.    entrada_epe_monto = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)
  84.    entrada_epe_monto.place(x=155, y=10)
  85.  
  86.    # Entradas(E.P.E-Kwh)    
  87.    entrada_epe_kwh = tk.Entry(caja_entrys, font=("Vardana", 12), width=5)
  88.    entrada_epe_kwh.place(x=335, y=10)
  89.  
  90.    # Entrada(Gas- Factura)    
  91.    entrada_gas_monto = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)
  92.    entrada_gas_monto.place(x=155, y=50)
  93.  
  94.    # Entradas(Gas- M3)    
  95.    entrada_gas_M3 = tk.Entry(caja_entrys, font=("Vardana", 12), width=5)
  96.    entrada_gas_M3.place(x=335, y=50)
  97.  
  98.    # Entrada(Comuna)    
  99.    entrada_comuna = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)
  100.    entrada_comuna.place(x=155, y=90)
  101.  
  102.    # Entrada(Ceodal)    
  103.    entrada_ceodal = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)
  104.    entrada_ceodal.place(x=155, y=130)
  105.  
  106.    # Entrada(Cable)    
  107.    entrada_cable = tk.Entry(caja_entrys, font=("Vardana", 12), width=10)
  108.    entrada_cable.place(x=155, y=170)
  109.  
  110.    # Frame para contener los botones
  111.    caja_botones = tk.Frame(servicios)
  112.    caja_botones.place(x=5, y=305)
  113.    caja_botones.config(width="416", height="60")
  114.    caja_botones.config(bd=5)
  115.    caja_botones.config(relief="ridge")
  116.  
  117.    # Botón Agregar
  118.    texto = ''' Agregar movimiento,
  119. no olvide seleccionar la fecha correcta... '''
  120.    boton_agregar = ttk.Button(caja_botones, text="Agregar",
  121.              command=partial(Funciones.agregar, caja_botones))
  122.    boton_agregar.place(x=5, y=5, width=80, height=40)
  123.    hovertip = Hovertip(boton_agregar, texto)
  124.  
  125.    # Botón Estadisticas
  126.    boton_estad = ttk.Button(caja_botones, text="Estadisticas",
  127.              command=partial(Funciones.estadisticas))
  128.    boton_estad.place(x=95, y=5, width=80, height=40)
  129.    hovertip = Hovertip(boton_estad, ' Estadisticas de servicios ')
  130.  
  131.    # Botón Cerrar
  132.    boton_cerrar = ttk.Button(caja_botones, text="Cerrar",
  133.              command=servicios.destroy)
  134.    boton_cerrar.place(x=320, y=5, width=80, height=40)
  135.    hovertip = Hovertip(boton_cerrar, ' Cerrar aplicación. ')
  136.  
  137.    servicios.mainloop()
  138.  
  139.  
  140. if __name__ == '__main__':
  141.    main()
  142.  

Código
  1. from datetime import datetime
  2.  
  3. def meses_():
  4.    meses = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio",
  5.             "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"]
  6.  
  7.    now = datetime.now()
  8.    mes = now.month
  9.    actual = meses[mes-1]
  10.  
  11.    return meses, actual
  12.  
  13. def anios_():
  14.    años = ["2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017",
  15.             "2018", "2019", "2020", "2021", "2022", "2023", "2024", "2025",
  16.             "2026", "2027", "2028", "2029", "2030", "2031", "2032", "2033"]
  17.  
  18.    now = datetime.now()
  19.    actual = now.year
  20.  
  21.    returnos, actual
  22.  
  23. def agregar(caja_botones):
  24.    caja_botones.place_forget()
  25.  
  26. def estadisticas():
  27.    print("estadisticas")
  28.  
Desde ya muchas gracias y que tengan todos un lindo jueves...
Slds. Daniel ☕☕☕


En línea

Danielㅤ


Desconectado Desconectado

Mensajes: 1.681


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #1 en: 20 Octubre 2022, 19:38 pm »

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 Desconectado

Mensajes: 94



Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #2 en: 20 Octubre 2022, 20:41 pm »

¿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 Desconectado

Mensajes: 1.681


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #3 en: 20 Octubre 2022, 23:47 pm »

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  :D


Saludos
En línea

El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #4 en: 21 Octubre 2022, 00:17 am »

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

Danielㅤ


Desconectado Desconectado

Mensajes: 1.681


🔵🔵🔵🔵🔵🔵🔵


Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #5 en: 21 Octubre 2022, 01:08 am »

Bueno en cuanto a lo que deseas saber, yo nunca trabajé con tkinter, todos los softwares que hice siempre fueron creados con wxPython, pero desde el punto de vista general, que seguramente o al menos supongo que debe ser igual que wxPython, es que para lograr lo que querés tenes que crear un grupo de controles, es decir crear un grupo de esos controles para que trabajen en conjunto, por lo que al inhabilitar un entry estarías desactivandolos a todos, otra forma seria crear un frame y que esos controles vayan dentro de ese frame.

Aquí te dejo ayuda al respecto:

https://www.plus2net.com/python/tkinter-LabelFrame.php

https://stackoverflow.com/questions/56517230/how-can-i-make-a-group-of-entries-in-python-tkinter-work-like-an-excel-sheet-by


Saludos
En línea

El mas antiguo

Desconectado Desconectado

Mensajes: 94



Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #6 en: 21 Octubre 2022, 02:04 am »

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

Código
  1.    # lista para pasar los parametros a funciones.
  2.    parametros = []
  3.    parametros.append(servicios)          #  [0] Ventana
  4.    parametros.append(combo_mes)          #  [1] Mes.
  5.    parametros.append(combo_anio)         #  [2] Año.
  6.    parametros.append(caja_entrys)        #  [3] Frame Label y Entrys.
  7.    parametros.append(entrada_epe_monto)  #  [4] EPE monto.
  8.    parametros.append(entrada_epe_kwh)    #  [5] EPE kwh.
  9.    parametros.append(entrada_gas_monto)  #  [6] GAS monto.
  10.    parametros.append(entrada_gas_M3)     #  [7] GAS M3.
  11.    parametros.append(entrada_comuna)     #  [8] Comuna.
  12.    parametros.append(entrada_ceodal)     #  [9] Ceodal.
  13.    parametros.append(entrada_cable)      # [10] Cable Max.
  14.    parametros.append(caja_botones)       # [11] Frame botones.


Código
  1. def agregar(parametros):
  2.    parametros[11].place_forget()
  3.  
  4.    # Activar todos los entrys.
  5.    indice = 4
  6.    while indice < 11:
  7.        parametros[indice].config(state=tk.NORMAL)
  8.        indice += 1

Slds. Daniel ☕☕☕
En línea

reymosquito

Desconectado Desconectado

Mensajes: 81


Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #7 en: 21 Octubre 2022, 16:28 pm »

Citar
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 Desconectado

Mensajes: 94



Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #8 en: 21 Octubre 2022, 20:54 pm »

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 Desconectado

Mensajes: 81


Ver Perfil
Re: Que todos los entry dentro de un frame sean readonly en tkinter.
« Respuesta #9 en: 21 Octubre 2022, 21:43 pm »

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:
Código
  1. #-*- coding:utf-8 -*-
  2. import tkinter as tk
  3. from tkinter import ttk
  4.  
  5. LETRA = ("Vardana", 12)
  6.  
  7. class Ventana:
  8.    def __init__(self,principal):
  9.        self.principal = principal
  10.        self.apariencia()
  11.        self.bloquear()
  12.  
  13.    def apariencia(self):
  14.        self.contenedor = tk.Frame(self.principal)
  15.        self.contenedor.place(x=5, y=85)
  16.        self.contenedor.config(width="416", height="213")
  17.        self.contenedor.config(bd=5)
  18.        self.contenedor.config(relief="ridge")
  19.        mensaje_epe = tk.Label(self.contenedor,text="E.P.E - Factura......$\t\t             Kwh....$",font=LETRA)
  20.        mensaje_epe.place(x=5, y=10)
  21.        mensaje_gas = tk.Label(self.contenedor,text="Gas - Factura.........$\t\t             M3......$",font=LETRA)
  22.        mensaje_gas.place(x=5, y=50)
  23.        mensaje_comuna = tk.Label(self.contenedor, text="Comuna..................$",font=LETRA)
  24.        mensaje_comuna.place(x=5, y=90)
  25.        mensaje_ceodal = tk.Label(self.contenedor, text="Ceodal....................$", font=LETRA)
  26.        mensaje_ceodal.place(x=5, y=130)
  27.        mensaje_cable = tk.Label(self.contenedor, text="Cable Max..............$",font=LETRA)
  28.        mensaje_cable.place(x=5, y=170)
  29.  
  30.        entrada_epe_monto = tk.Entry(self.contenedor, font=(LETRA), width=10)
  31.        entrada_epe_monto.place(x=155, y=10)
  32.        entrada_epe_kwh = tk.Entry(self.contenedor, font=(LETRA), width=5)
  33.        entrada_epe_kwh.place(x=335, y=10)
  34.        entrada_gas_monto = tk.Entry(self.contenedor, font=(LETRA), width=10)
  35.        entrada_gas_monto.place(x=155, y=50)
  36.        entrada_gas_M3 = tk.Entry(self.contenedor, font=(LETRA), width=5)
  37.        entrada_gas_M3.place(x=335, y=50)
  38.        entrada_comuna = tk.Entry(self.contenedor, font=(LETRA), width=10)
  39.        entrada_comuna.place(x=155, y=90)
  40.        entrada_ceodal = tk.Entry(self.contenedor, font=(LETRA), width=10)
  41.        entrada_ceodal.place(x=155, y=130)
  42.        entrada_cable = tk.Entry(self.contenedor, font=(LETRA), width=10)
  43.        entrada_cable.place(x=155, y=170)        
  44.  
  45.  
  46.        caja_botones = tk.Frame(self.principal)
  47.        caja_botones.place(x=5, y=305)
  48.        caja_botones.config(width="416", height="60")
  49.        caja_botones.config(bd=5)
  50.        caja_botones.config(relief="ridge")
  51.  
  52.        boton_agregar = ttk.Button(caja_botones, text="Agregar",command=self.desbloquear)
  53.        boton_agregar.place(x=5, y=5, width=80, height=40       )  
  54.  
  55.  
  56.    def bloquear(self):
  57.        for x in range(5,12):
  58.            self.contenedor.winfo_children()[x].config(state= "readonly")
  59.  
  60.    def desbloquear(self):
  61.        for x in range(5,12):
  62.            self.contenedor.winfo_children()[x].config(state= "normal")        
  63.  
  64. def centrar_Ventana(root):
  65.    w = 430
  66.    h = 375
  67.    ws = root.winfo_screenwidth()
  68.    hs = root.winfo_screenheight()
  69.    x = (ws/2) - (w/2)
  70.    y = (hs/2) - (h/2)
  71.    root.geometry('%dx%d+%d+%d' % (w, h, x, y))        
  72.  
  73. def  inicial():
  74.    raiz=tk.Tk()
  75.    raiz.title(" Servicios.")
  76.    centrar_Ventana(raiz)    
  77.    ventana=Ventana(raiz)
  78.    mensaje_mes = tk.Label(raiz, text="Mes", font=(LETRA))
  79.    mensaje_mes.place(x=15, y=10)    
  80.    raiz.mainloop()
  81.  
  82. if __name__=='__main__':
  83.    inicial()
  84.  
  85.  

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

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Python\Tkinter]Marcar limites a un listbox o frame
Scripting
AdeLax 0 2,696 Último mensaje 5 Agosto 2013, 18:46 pm
por AdeLax
Meter un Frame dentro de otro Frame « 1 2 3 4 »
Java
kikian94 34 17,454 Último mensaje 28 Marzo 2015, 12:47 pm
por kikian94
Rellenar una caja de tkinter "Entry" sin botones
Scripting
PUAROT 4 4,255 Último mensaje 14 Julio 2016, 00:28 am
por PUAROT
Tkinter UI de python 3.x, ayuda con Entry
Scripting
royer14 2 2,872 Último mensaje 8 Noviembre 2017, 13:38 pm
por royer14
Obtener contenido de todos los entry tkinter
Scripting
SlayerBur 4 4,518 Último mensaje 26 Septiembre 2022, 18:50 pm
por SlayerBur
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines