¿Hay alguna manera de hacer que el widget de texto Tkinter sea solo de lectura?

No parece que tenga ese atributo, pero sería realmente útil para mí.

Related of "¿Hay alguna manera de hacer que el widget de texto Tkinter sea solo de lectura?"

text.insert() cambiar el estado del widget de Text de NORMAL a text.insert() después de ingresar text.insert() o text.bind() :

 text.config(state=DISABLED) 
 text = Text(app, state='disabled', width=44, height=5) 

Antes y después de la inserción, cambie el estado, de lo contrario no se actualizará

 text.configure(state='normal') text.insert('end', 'Some Text') text.configure(state='disabled') 

El wiki de tcl describe este problema en detalle y enumera tres soluciones posibles:

  1. El truco Deshabilitar / Habilitar descrito en otras respuestas
  2. Reemplace los enlaces para los eventos de insertar / eliminar
  3. Igual que (2), pero envuélvalo en un widget separado.

(2) o (3) sería preferible, sin embargo, la solución no es obvia. Sin embargo, una solución trabajada está disponible en la wiki unpythonic :

  from Tkinter import Text from idlelib.WidgetRedirector import WidgetRedirector class ReadOnlyText(Text): def __init__(self, *args, **kwargs): Text.__init__(self, *args, **kwargs) self.redirector = WidgetRedirector(self) self.insert = self.redirector.register("insert", lambda *args, **kw: "break") self.delete = self.redirector.register("delete", lambda *args, **kw: "break") 

Una solución muy sencilla es simplemente vincular cualquier pulsación de tecla a una función que devuelve “break”, como:

 import Tkinter root = Tkinter.Tk() readonly = Tkinter.Text(root) readonly.bind("", lambda e: "break") 

No tengo una reputación de 50, por lo que no puedo agregar un comentario a la respuesta de nbro . Sin embargo, ahí es a donde pertenece esta respuesta.

Si su caso de uso es realmente simple, el código text.bind de nbro (‘<1>‘, evento lambda: text.focus_set ()) resuelve el problema de interactividad que Craig McQueen ve en OS X pero que otros no ven en Windows y Linux

OTOH, si sus datos de solo lectura tienen alguna estructura contextual, en algún momento probablemente terminará usando Tkinter.Text.insert ( posición , texto , lista de tags ) para agregarlo a la ventana de su cuadro de texto de solo lectura debajo de una etiqueta. Lo hará porque desea que partes de los datos se destaquen según el contexto. El texto que se ha marcado con tags se puede enfatizar llamando a .Text.tag_config () para cambiar la fuente o los colores, etc. De manera similar, el texto que se ha marcado con tags puede tener enlaces interactivos adjuntos usando .Text.tag_bind () Hay un buen ejemplo del uso de estas funciones aquí . Si una función mark_for_paste () es buena, una función mark_for_paste () que entiende el contexto de sus datos es probablemente mejor.

 from Tkinter import * root = Tk() text = Text(root) text.insert(END,"Some Text") text.configure(state='disabled') 

Use este código en Windows si desea deshabilitar la edición del usuario y permitir Ctrl + C para copiar en el texto de la pantalla:

 def txtEvent(event): if(event.state==12 and event.keysym=='c' ): return else: return "break" txt.bind("", lambda e: txtEvent(e)) 

Si seleccionar texto no es algo que necesita, deshabilitar el estado es la forma más sencilla de hacerlo. Para admitir la copia, puede utilizar una entidad externa, un Button , para realizar el trabajo. Cuando el usuario presiona el botón, el contenido del Text se copia al portapapeles. Tk tiene un soporte integrado para manejar el portapapeles (ver aquí ), por lo que emular el comportamiento de Ctrl-C es una tarea fácil. Si está construyendo, digamos una consola donde se escriben los mensajes de registro, puede ir más allá y agregar una Entry donde el usuario pueda especificar la cantidad de mensajes de registro que desea copiar.