Ссылка 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.
Вы должны изменить состояние виджета Text
с NORMAL
на DISABLED
после ввода text.insert()
или text.bind()
:
text.config(state=DISABLED)
У меня нет репутации 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 (), которая понимает контекст ваших данных, вероятно, более приятна.
Очень простое решение - просто привязать любое нажатие клавиши к функции, которая возвращает «break» следующим образом:
import Tkinter
root = Tkinter.Tk()
readonly = Tkinter.Text(root)
readonly.bind("<Key>", lambda e: "break")
tcl wiki подробно описывает эту проблему и перечисляет три возможных решения:
(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")
Если вы выбираете текст, вам не нужно отключать состояние, это самый простой способ. Для поддержки копирования вы можете использовать внешний объект - Button
- для выполнения задания. Всякий раз, когда пользователь нажимает кнопку, содержимое Text
будет скопировано в буфер обмена. Tk
имеет встроенную поддержку обработки буфера обмена (см. здесь ), поэтому эмуляция поведения Ctrl-C
является легкой задачей. Если вы строите, скажем, консоль, на которой записаны сообщения журнала, вы можете пойти дальше и добавить Entry
, где пользователь может указать количество сообщений журнала, которые он хочет скопировать.
text = Text(app, state='disabled', width=44, height=5)
До и после вставки измените состояние, иначе оно не будет обновлено
text.configure(state='normal')
text.insert('end', 'Some Text')
text.configure(state='disabled')
from Tkinter import *
root = Tk()
text = Text(root)
text.insert(END,"Some Text")
text.configure(state='disabled')
Используйте этот код в 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))