No parece que tenga ese atributo, pero sería realmente útil para mí.¿Hay alguna manera de hacer que el widget de texto Tkinter sea solo de lectura?
Respuesta
usted tiene que cambiar the state del widget Text
NORMAL
-DISABLED
después entrar text.insert()
o text.bind()
:
text.config(state=DISABLED)
Entonces no puede seleccionar texto y copiarlo. –
Seleccionar y copiar (a través de CTRL-C en Windows y automáticamente en Linux) parece funcionar bien para mí. – Dologan
@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
El tcl wiki describe este problema en detalle, y enumera tres soluciones posibles:
- El truco de deshabilitar/habilitar descrito en otras respuestas
- Reemplazar los enlaces para los eventos insertar/eliminar
- 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")
¿Qué es 'idlelib' y de dónde viene? Sería bueno tener una solución que no necesita una dependencia 'idlelib'. –
En Ubuntu Linux, puedo obtener 'idlelib' por' sudo apt-get install idle-python2.7' –
'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
from Tkinter import *
root = Tk()
text = Text(root)
text.insert(END,"Some Text")
text.configure(state='disabled')
Entonces no puede seleccionar texto y copiarlo. –
Puede seleccionar texto y copiar también. Me funciona en Windows – manty
@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. –
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')
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")
Esto funcionó muy bien para mi uso. Necesitaba enlazar una función para permitir que se siguieran los hipervínculos. – tijko
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.
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))
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.
- 1. En Tkinter, ¿hay alguna forma de hacer que un widget no sea visible?
- 2. ¿Hay alguna manera fácil de hacer que ScrollViewer sea "hinchable"?
- 3. ¿Hay alguna manera de hacer que UserControl sea inafocable?
- 4. Widget de texto de solo lectura en python3-tkinter; plataforma cruzada
- 5. ¿Hay alguna manera de hacer que un área de texto sea parcialmente editable? (solo editable partes del texto)
- 6. ¿Texto subrayado en el widget Etiqueta Tkinter?
- 7. ¿Hay alguna manera de hacer que el proceso de doxigen código C no documentado sea automático?
- 8. ¿Hay alguna manera de hacer que el simulador de iPad sea más grande?
- 9. Cómo leer el texto de un texto Tkinter Widget
- 10. Hacer que el widget Tkinter tome el foco
- 11. ¿Hay alguna manera de hacer que un DIV no sea seleccionable?
- 12. ¿Hay algún beneficio en hacer que un campo C# sea de solo lectura si es apropiado?
- 13. ¿Hay alguna manera de animar en un widget de inicio?
- 14. Cómo resaltar texto en un widget de texto tkinter
- 15. ¿Hay alguna manera de hacer la asignación de servlets en eclipse IDE que no sea manualmente?
- 16. ¿Hay alguna manera de hacer que un operador de comparación sea una variable?
- 17. ¿Hay alguna manera de hacer que la salida de PrintWriter sea en formato UNIX?
- 18. ¿Cómo borrar todo desde el widget de texto tkinter?
- 19. ¿Puedo configurar el cuadro de texto para que sea de solo lectura cuando se usa Html.TextBoxFor?
- 20. ¿Hay alguna manera de hacer que un constructor solo sea visible para una clase padre en C#?
- 21. ¿Hay alguna manera de hacer que @section sea opcional con asp.net mvc Razor ViewEngine?
- 22. ¿Hay alguna manera de hacer que IE8 no ignore una regla CSS que solo entiende parcialmente?
- 23. ¿Hay alguna manera de hacer que una variable TSQL sea constante?
- 24. ¿Hay alguna manera fácil de hacer que la matriz anidada sea plana?
- 25. ¿Hay alguna manera de hacer que el texto no se pueda seleccionar en una página HTML?
- 26. ¿Hay alguna manera de crear un XDocument inmutable (de solo lectura)?
- 27. ¿Hay alguna solución para hacer que un miembro de la estructura sea de alguna manera "privado" en C?
- 28. Subversion: ¿es posible deshabilitar todas las confirmaciones y hacer que el repositorio solo sea de lectura?
- 29. ¿Hay alguna manera de hacer que el tiempo de ejecución de Jruby sea interno en todas las cadenas?
- 30. ¿Hay alguna manera de hacer que los robots ignoren cierto texto?
Un widget 'Entry' de Tkinter permite' entry.config (state = 'readonly') '. Lamentablemente, esto no parece funcionar para el widget 'Text'. –