Есть ли способ сделать текстовый виджет Tkinter доступным только для чтения? - PullRequest
47 голосов
/ 01 октября 2010

Не похоже, что у него есть этот атрибут, но это было бы очень полезно для меня.

Ответы [ 8 ]

64 голосов
/ 01 октября 2010

Необходимо изменить состояние виджета Text с NORMAL на DISABLED после ввода text.insert() или text.bind():

text.config(state=DISABLED)
24 голосов
/ 26 июля 2014
text = Text(app, state='disabled', width=44, height=5)

До и после вставки измените состояние, иначе оно не будет обновляться

text.configure(state='normal')
text.insert('end', 'Some Text')
text.configure(state='disabled')
19 голосов
/ 23 июля 2012

tcl wiki подробно описывает эту проблему и перечисляет три возможных решения:

  1. Трюк "Отключить / Включить", описанный в других ответах
  2. Заменитьпривязки для событий вставки / удаления
  3. То же, что и (2), но оберните их в отдельный виджет.

(2) или (3) будет предпочтительнее, однако,решение не очевидно.Тем не менее, отработанное решение доступно на 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")
13 голосов
/ 15 января 2016

Очень простое решение - привязать любое нажатие клавиши к функции, которая возвращает «break» следующим образом:

import Tkinter

root = Tkinter.Tk() 

readonly = Tkinter.Text(root)
readonly.bind("<Key>", lambda e: "break")
7 голосов
/ 06 апреля 2016

У меня нет 50 репутации, поэтому я не могу добавить комментарий к nbro's ответу. Тем не менее, вот где этот ответ принадлежит.

Если ваш вариант использования действительно прост, nbro's text.bind ('<1>', лямбда-событие: text.focus_set ()) код решает проблему интерактивности, которая Крейг МакКуин видит в OS X, но другие не видят в Windows и Linux.

OTOH, если ваши данные только для чтения имеют какую-либо контекстную структуру, в какой-то момент вы, вероятно, в итоге будете использовать Tkinter.Text.insert ( position , text , taglist ), чтобы добавить его в свое текстовое окно только для чтения под тегом. Вы сделаете это, потому что хотите, чтобы части данных выделялись в зависимости от контекста. Текст, помеченный тегами, можно выделить, вызвав .Text.tag_config (), чтобы изменить шрифт или цвета и т. Д. Аналогично, текст, помеченный тегами, может иметь интерактивные привязки, прикрепленные с помощью .Text.tag_bind (). Вот хороший пример использования этих функций здесь . Если функция mark_for_paste () хороша, функция mark_for_paste (), которая понимает контекст ваших данных, вероятно, лучше.

4 голосов
/ 11 сентября 2012
from Tkinter import *
root = Tk()
text = Text(root)
text.insert(END,"Some Text")
text.configure(state='disabled')
2 голосов
/ 31 июля 2017

Используйте этот код в Windows, если вы хотите отключить пользовательское редактирование и разрешить Ctrl + C для копирования на экране текста:

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

txt.bind("<Key>", lambda e: txtEvent(e))
1 голос
/ 17 августа 2017

Если выделение текста не является чем-то необходимым, отключение состояния - это самый простой способ.Для поддержки копирования вы можете использовать внешнюю сущность - Button - для выполнения этой работы.Всякий раз, когда пользователь нажимает кнопку, содержимое Text будет скопировано в буфер обмена.Tk имеет встроенную поддержку обработки буфера обмена (см. здесь ), поэтому эмуляция поведения Ctrl-C - простая задача.Если вы строите, скажем, консоль, в которую записываются сообщения журнала, вы можете пойти дальше и добавить Entry, где пользователь может указать количество сообщений журнала, которые он хочет скопировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...