Использование GtkTextView для отображения большого количества сгенерированного текста (пользовательский GtkTextBuffer?)
Я хочу написать приложение на Python, которое использует GTK (через gi.repository
) для отображения текстового представления огромного количества данных. (В частности, разобраны инструкции из программы, аналогично тому, что показывает IDA.)
Я подумал, что это должно быть довольно просто: использовать обычный GtkTextView и пользовательский подкласс GtkTextBuffer, который будет обрабатывать запрос "дай мне немного текста", генерировать некоторый текст (разбирать некоторые инструкции) и некоторые теги (для раскрашивания, форматирования и т. Д.) и вернуть их.
Проблема в том, что я не могу найти какую-либо информацию о том, как таким образом создать подкласс GtkTextBuffer, чтобы сам предоставить текст. Я пытался просто реализовать get_text
а также get_slice
методы в моем подклассе, но они, кажется, никогда не вызывают. Кажется, что единственное, что я могу сделать, это использовать стандартный GtkTextBuffer и set_text
метод, и попробуйте как-то отслеживать позицию курсора и количество отображаемых строк, но это, кажется, полностью противоположно тому, как должен работать MVC. Потенциально существуют миллионы строк, поэтому генерация всего текста заранее невозможна.
Я использую Python 3.4 и GTK3.
1 ответ
Gtk.TextBuffer
из внешней библиотеки, которая не написана на Python. Вы столкнулись с одним ограничением этой ситуации. С большинством библиотек Python вы можете создавать подклассы для их классов или устанавливать их API-интерфейсы по своему усмотрению. Код GTK на C, с другой стороны, не знает, что он используется из Python, и, как вы заметили, полностью игнорирует ваши переопределенные get_text()
а также get_slice()
методы.
Классы GTK дополнительно имеют ограничение, заключающееся в том, что вы можете переопределять только те методы, которые были объявлены "виртуальными". Вот как это переводится на Python: вы можете увидеть список виртуальных методов в документации по Python GI ( пример дляGtk.TextBuffer
). Все эти методы начинаются с do_
и не предназначены для вызова из вашей программы, только переопределены. Python GI уведомит код GTK об этих переопределениях, чтобы при переопределении, например, do_insert_text()
и впоследствии позвонить insert_text()
цепочка вызовов будет выглядеть примерно так:
- питон
insert_text()
- С
gtk_text_buffer_insert_text()
- С
GtkTextBufferClass->insert_text()
(внутренний виртуальный метод)- питон
do_insert_text()
- питон
- С
- С
К сожалению, как вы можете видеть из документации, на которую я ссылался выше, get_text()
а также get_slice()
не являются виртуальными, поэтому вы не можете переопределить их в подклассе.
Вы можете достичь своей цели, обернув один TextBuffer
(который содержит все ваши разобранные инструкции) в другом (который содержит отрывок и фактически связан с текстовым представлением.) Вы можете установить метки в первом текстовом буфере, чтобы показать, где отрывок должен начинаться или заканчиваться, и подключиться сигналы таковы, что, когда текст в первом текстовом буфере изменяется или метки изменяются, тогда текст между метками копируется во второй текстовый буфер.