Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Que todos los entry dentro de un frame sean readonly en tkinter.
#1
Hola gente, ¿cómo estás, Francisco?
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ó.-

No subo lo que tengo hecho porque son 3 módulos y no me parece importante,
si creen lo contrario, díganmelo.-

Desde ya muchas gracias por el tiempo que le dediquen...
Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#2
Hola, Daniel, ¿cómo estás?

No veo otra forma de hacerlo que no sea llamando a .config(state="readonly") en cada uno de los entries, así que creo que la solución del bucle es la mejor. Si después necesitás hacerlo en distintos lugares del código, tal vez ahí te convenga crear una función o una clase que herede de ttk.Frame y tenga un método con el bucle.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder
#3
Gracias Francisco.-
A continuación 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:
    # 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.

Código:
def agregar(parametros):
    parametros[11].place_forget()

    # Activar todos los entrys.
    indice = 4
    while indice < 11:
        parametros[indice].config(state=tk.NORMAL)
        indice += 1

Cita:...Si después necesitás hacerlo en distintos lugares del código, tal vez ahí te convenga crear una función o una clase que herede de ttk.Frame y tenga un método con el bucle.
Me generaste muchas preguntas con esta frase, cuando tenga más
conocimiento de la POO, en el futuro te voy a pedir más precisiones.- 

Slds. Daniel ☕☕☕
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Responder
#4
Hola, Daniel.

Me refería a algo como esto:

Código:
import tkinter as tk
from tkinter import ttk


class Entradas(ttk.Frame):

    def __init__(self):
        super().__init__()
        self.entrada_epe_monto = ttk.Entry(self)
        self.entrada_epe_kwh = ttk.Entry(self)
        self.entrada_gas_monto = ttk.Entry(self)
        self.entrada_gas_M3 = ttk.Entry(self)
        self.entrada_comuna = ttk.Entry(self)
        self.entrada_ceodal = ttk.Entry(self)
        self.entrada_cable = ttk.Entry(self)
        for entrada in self.obtener_entradas():
            entrada.pack()
    
    def obtener_entradas(self):
        """
        Retorna en una lista todos los atributos de esta clase del tipo
        ttk.Entry.
        """
        return [obj for obj in self.__dict__.values() if isinstance(obj, ttk.Entry)]
    
    def habilitar(self):
        for entrada in self.obtener_entradas():
            entrada.config(state=tk.NORMAL)
    
    def deshabilitar(self):
        for entrada in self.obtener_entradas():
            entrada.config(state="readonly")


ventana = tk.Tk()
ventana.geometry("600x400")
entradas = Entradas()
entradas.pack()
# Luego podés usar:
entradas.deshabilitar()
# entradas.habilitar()
ventana.mainloop()

Es simplemente una forma de organizar todas tus entradas dentro de una clase, para que las puedas tratar como solo un objeto. Así, podés habilitar o deshabilitar todas usando entradas.habilitar() o entradas.deshabilitar().

El ejemplo ubica las cajas con pack() para simplificar, pero podés usar también grid() o place().

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!

También ofrecemos consultoría profesional de desarrollo en Python para personas y empresas.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)