Cómo hacer que el widget Tkinter Text sea sólo de lectura

  1. Ponga el estado Text en disable para que Tkinter Text sea sólo de lectura
  2. Ate cualquier tecla que pulse a la función break para hacer que Tkinter sea Text de sólo lectura

Introduciremos métodos para hacer que el widget Tkinter Text sea de sólo lectura,

  1. Poner el estado Text en disable.
  2. Vincular cualquier pulsación de tecla a la función break.

Ponga el estado Text en disable para que Tkinter Text sea sólo de lectura

El widget Text se convierte en sólo lectura después de que su estado sea disable.

import tkinter as tk
root = tk.Tk()
readOnlyText = tk.Text(root)
readOnlyText.insert(1.0,"ABCDEF")
readOnlyText.configure(state='disabled')
readOnlyText.pack()

root.mainloop()

El estado por defecto de un widget de Texto es NORMAL, lo que significa que el usuario puede editar, añadir, insertar o editar el contenido del texto en él.

readOnlyText.configure(state='disabled')

Necesita cambiar el estado del widget Text a DISABLED para hacerlo de sólo lectura. Cualquier intento de cambiar el texto dentro de ese widget será ignorado silenciosamente.

Advertencia

Necesita cambiar el estado de desactivado a normal si pretende actualizar el contenido del widget Texto, de lo contrario, se mantiene como sólo lectura.

Ate cualquier tecla que pulse a la función break para hacer que Tkinter sea Text de sólo lectura

Si ligamos cualquier golpe de tecla a la función que sólo devuelve break al widget Text, podríamos obtener el mismo resultado que el Text se convierte en sólo lectura.

import tkinter as tk
root = tk.Tk()
readOnlyText = tk.Text(root)
readOnlyText.insert(1.0,"ABCDEF")
readOnlyText.bind("<Key>", lambda a: "break")
readOnlyText.pack()

root.mainloop()
Atención

La diferencia entre esta solución y la anterior es que el CTRL+C no funciona aquí. Significa que no puedes ni editar el contenido ni copiarlo.

Necesitamos hacer la excepción de CTRL+C a la función que enlaza con el Text si se desea CTRL+C.

import tkinter as tk

def ctrlEvent(event):
    if(12==event.state and event.keysym=='c' ):
        return
    else:
        return "break"

root = tk.Tk()
readOnlyText = tk.Text(root)
readOnlyText.insert(1.0,"ABCDEF")
readOnlyText.bind("<Key>", lambda e: ctrlEvent(e))
readOnlyText.pack()

root.mainloop()
comments powered by Disqus