Il ne semble pas avoir cet attribut, mais ce serait vraiment utile pour moi.
Vous devez changer l'état du widget Text
de NORMAL
à DISABLED
après en saisissant text.insert()
ou text.bind()
:
text.config(state=DISABLED)
text = Text(app, state='disabled', width=44, height=5)
Avant et après l'insertion, changez l'état, sinon il ne se mettra pas à jour
text.configure(state='normal')
text.insert('end', 'Some Text')
text.configure(state='disabled')
Le tcl wiki décrit ce problème en détail et énumère trois solutions possibles:
(2) ou (3) seraient préférables, cependant, la solution n'est pas évidente. Cependant, ne solution fonctionnelle est disponible sur le 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")
La solution très simple est de lier n'importe quelle pression de touche à une fonction qui retourne "break" comme ceci:
import Tkinter
root = Tkinter.Tk()
readonly = Tkinter.Text(root)
readonly.bind("<Key>", lambda e: "break")
Je n'ai pas 50 points de réputation, je ne peux donc pas ajouter de commentaire sur la réponse nbro's . Néanmoins, c'est là que cette réponse appartient.
Si votre cas d'utilisation est vraiment simple, nbro's text.bind ('<1>', événement lambda: text.focus_set ()) code résout le problème d'interactivité qui Craig McQueen voit sur OS X mais que les autres ne voient pas sur Windows et Linux.
OTOH, si vos données en lecture seule ont une structure contextuelle, à un moment donné, vous finirez probablement par utiliser Tkinter.Text.insert ( position , text, taglist) pour l'ajouter à votre fenêtre de zone de texte en lecture seule sous une balise. Vous le ferez parce que vous souhaitez que certaines parties des données se distinguent en fonction du contexte. Le texte marqué avec des balises peut être accentué en appelant . Text.tag_config () pour changer la police ou les couleurs, etc. De même, le texte qui a été balisés avec des balises peuvent avoir des liaisons interactives attachées en utilisant . Text.tag_bind (). Il y a un bon exemple d'utilisation de ces fonctions ici . Si une fonction mark_for_paste () est Nice, une fonction mark_for_paste () qui comprend le contexte de vos données est probablement plus agréable.
from Tkinter import *
root = Tk()
text = Text(root)
text.insert(END,"Some Text")
text.configure(state='disabled')
Utilisez ce code dans Windows si vous souhaitez désactiver la modification utilisateur et autoriser Ctrl+C pour copie sur texte à l'écran:
def txtEvent(event):
if(event.state==12 and event.keysym=='c' ):
return
else:
return "break"
txt.bind("<Key>", lambda e: txtEvent(e))
Si la sélection de texte n'est pas quelque chose dont vous avez besoin, la désactivation de l'état est la façon la plus simple de procéder. Afin de prendre en charge la copie, vous pouvez utiliser une entité externe - Button
- pour effectuer le travail. Chaque fois que l'utilisateur appuie sur le bouton, le contenu de Text
sera copié dans le presse-papiers. Tk
a un support intégré de gestion du presse-papiers (voir ici ) afin d'émuler le comportement de Ctrl-C
est une tâche facile. Si vous construisez disons une console où les messages de journal sont écrits, vous pouvez aller plus loin et ajouter un Entry
où l'utilisateur peut spécifier le nombre de messages de journal qu'il veut copier.