web-dev-qa-db-fra.com

Existe-t-il un moyen de rendre le widget texte Tkinter en lecture seule?

Il ne semble pas avoir cet attribut, mais ce serait vraiment utile pour moi.

48
rectangletangle

Vous devez changer l'état du widget Text de NORMAL à DISABLED après en saisissant text.insert() ou text.bind():

text.config(state=DISABLED)
65
ars
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')
25
renzowesterbeek

Le tcl wiki décrit ce problème en détail et énumère trois solutions possibles:

  1. L'astuce Désactiver/Activer décrite dans d'autres réponses
  2. Remplacer les liaisons pour les événements d'insertion/suppression
  3. Identique à (2), mais envelopper dans un widget séparé.

(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")
20
freakboy3742

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")
14
FoxDot

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.

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

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))
3
Pal

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.

2
rbaleksandar