2010-10-01 18 views

Respuesta

47

usted tiene que cambiar the state del widget TextNORMAL-DISABLEDdespués entrar text.insert() o text.bind():

text.config(state=DISABLED) 
+7

Entonces no puede seleccionar texto y copiarlo. –

+1

Seleccionar y copiar (a través de CTRL-C en Windows y automáticamente en Linux) parece funcionar bien para mí. – Dologan

+10

@CraigMcQueen En realidad, puede hacerlo vinculando el '<1>' con una función que establece el foco en el widget de texto: 'text.bind (" <1> ", evento lambda: text.focus_set())'. – nbro

15

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

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

(2) o (3) sería preferible, sin embargo, la solución no es obvia. Sin embargo, a worked solution is available on the unpythonic wiki:

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") 
+0

¿Qué es 'idlelib' y de dónde viene? Sería bueno tener una solución que no necesita una dependencia 'idlelib'. –

+0

En Ubuntu Linux, puedo obtener 'idlelib' por' sudo apt-get install idle-python2.7' –

+3

'idlelib' es parte de la biblioteca estándar de Python. Sin embargo, por alguna razón, Ubuntu parece disfrutar empaquetando Python en muchas partes pequeñas. – freakboy3742

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

Entonces no puede seleccionar texto y copiarlo. –

+1

Puede seleccionar texto y copiar también. Me funciona en Windows – manty

+1

@CraigMcQueen - Estoy bastante seguro de que esto se maneja internamente, independientemente del estado. No sé si puede desactivar la selección y la copia, tampoco. –

14
text = Text(app, state='disabled', width=44, height=5) 

Antes y después de insertar, cambiar el estado, de lo contrario, no se actualizará

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

solución muy fácil es sólo para enlazar cualquier pulsación de tecla a una función que devuelve "break" como así:

import Tkinter 

root = Tkinter.Tk() 

readonly = Tkinter.Text(root) 
readonly.bind("<Key>", lambda e: "break") 
+0

Esto funcionó muy bien para mi uso. Necesitaba enlazar una función para permitir que se siguieran los hipervínculos. – tijko

6

No tengo 50 reputación, así que no puedo agregar un comentario en nbro's respuesta. No obstante, ahí es donde pertenece esta respuesta.

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

otoh, si los datos de sólo lectura tiene ninguna estructura contextual, en algún momento es probable que terminan usando Tkinter.Text.insert (posición, texto, taglist) para añadirlo a su ventana de cuadro de texto de solo lectura debajo de una etiqueta. Harás esto porque quieres que partes de los datos se destaquen según el contexto. El texto marcado con etiquetas se puede enfatizar llamando al .Text.tag_config() para cambiar la fuente o colores, etc. Del mismo modo, el texto marcado con etiquetas puede tener vinculados interactivos mediante .Text.tag_bind(). Hay un buen ejemplo de usar these functions here. Si una función mark_for_paste() es agradable, una función mark_for_paste() que comprende el contexto de sus datos es probablemente más agradable.

1

Utilice este código en las ventanas si desea desactivar la edición del usuario y permitir Ctrl + C para la copia de texto de la pantalla:

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

txt.bind("<Key>", lambda e: txtEvent(e)) 
0

Si la selección de texto no es algo que necesita, desactivando el estado es la manera más simple de ir Para poder copiar, puede usar una entidad externa, una Button, para hacer el trabajo. Cada vez que el usuario presiona el botón, el contenido de Text se copiará en el portapapeles. Tk tiene un soporte integrado para manejar el portapapeles (ver here) 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 un Entry donde el usuario puede especificar la cantidad de mensajes de registro que quiere copiar.

Cuestiones relacionadas