Как я могу сделать этот текстовый виджет Tkinter только для чтения? [Дубликат]

Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:

Предположим, что у вас есть класс с именем Student.

public class Student
{
    private string FirstName;
    private string LastName;
    public string GetFullName()
    {
        return FirstName + LastName;
    }
}

Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.

public class StudentInfo
{      
    public string GetStudentName()
    {
        Student s;
        string fullname = s.GetFullName();
        return fullname;
    }        
}

Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.

36
задан rectangletangle 1 October 2010 в 19:47
поделиться

8 ответов

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

text.config(state=DISABLED)
53
ответ дан Alexz Vendz 27 August 2018 в 00:44
поделиться

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

Если ваш пример использования действительно прост, nbro's text.bind ('& lt; 1>', lambda event: text. Код focus_set ()) решает проблему интерактивности, которую видит Craig McQueen в OS X, но другие не видят в Windows и Linux.

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

6
ответ дан Community 27 August 2018 в 00:44
поделиться

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

import Tkinter

root = Tkinter.Tk() 

readonly = Tkinter.Text(root)
readonly.bind("<Key>", lambda e: "break")
10
ответ дан FoxDot 27 August 2018 в 00:44
поделиться

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

  1. Тройка Disable / Enable, описанная в других ответах
  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")
16
ответ дан freakboy3742 27 August 2018 в 00:44
поделиться

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

0
ответ дан rbaleksandar 27 August 2018 в 00:44
поделиться
text = Text(app, state='disabled', width=44, height=5)

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

text.configure(state='normal')
text.insert('end', 'Some Text')
text.configure(state='disabled')
19
ответ дан renzowesterbeek 27 August 2018 в 00:44
поделиться
from Tkinter import *
root = Tk()
text = Text(root)
text.insert(END,"Some Text")
text.configure(state='disabled')
2
ответ дан sarbjit 27 August 2018 в 00:44
поделиться

Используйте этот код в 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
ответ дан Stephen Rauch 27 August 2018 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: