нельзя заменить данные в сериализованном текстовом представлении, проблема с размером байтового массива? - PullRequest
0 голосов
/ 17 ноября 2018

Я действительно борюсь с сериализованными данными текстового буфера.Я только что столкнулся с проблемой кодирования SQL (спасибо theGtkNerd за помощь.) И теперь мои проблемы вернулись.Я пытаюсь добавить функциональность поиска / замены в текстовое представление, которое использует pixbufs и форматированный текст, так как у меня есть изображения / теги, хранящиеся в буфере, я пытаюсь выполнить замену в сериализованных данных буфера текстового представления.следующий код работает до тех пор, пока строка замены имеет тот же размер, что и строка поиска.

def _diagFnRReplaceAll(self,oWidget): #Replace All Function
    findbox = self.builder.get_object('FnRFindEntry')
    searchstr = findbox.get_text()
    buf = self.dataview.get_buffer()
    repbox = self.builder.get_object('FnRReplaceEntry')
    repstr = repbox.get_text()
    format = buf.register_serialize_tagset()

    data = buf.serialize(buf, format, buf.get_start_iter(),
    buf.get_end_iter())

    sys.stdout.buffer.write(data) #< print raw for debugging
    newdata = data.replace(bytes(searchstr,'ascii'),bytes(repstr,'ascii'))
    print("\n\n\n\n")
    sys.stdout.buffer.write(newdata) #< print raw for debugging

    buf.set_text('')
    format = buf.register_deserialize_tagset()
    buf.deserialize(buf, format, buf.get_end_iter(),newdata)

если она меньше или больше, я получаю следующую ошибку.

Gtk:ERROR:../../../../gtk/gtktextbufferserialize.c:1588:text_handler: code should not be reached

я попытался изменитьтип кодировки и разные способы кодирования, но это не помогло.тот факт, что строка одинакового размера работает нормально, заставляет меня думать, что есть значение размера для сериализованных буферных данных или данных pixbuf где-то, но я не могу ничего найти, выполнив поиск.Я попытался сделать замену, как вы сделали бы для текстового обзора без фото, он работал, но потерял данные рис / формат.

Кто-нибудь знает, почему это происходит?

или кто-нибудь знает другой способ поиска и замены в виджете textview, который имеет данные pixbuf и теги форматирования?

1 Ответ

0 голосов
/ 18 ноября 2018

хорошо, я получил это, используя небольшое исправление байтов. Я только что видел ваш комментарий об использовании меток, я рассмотрю это, поскольку я предпочел бы использовать встроенную функциональность вместо того, что я делаю.Мой способ - заменить 4 байта после GTKBUFFERCONTENTS-001 новым 4-байтовым значением для нового размера буфера.вот что у меня сейчас работает

def _diagFnRReplaceAll(self,oWidget):
    findbox = self.builder.get_object('FnRFindEntry')
    searchstr = findbox.get_text()
    buf = self.dataview.get_buffer()
    repbox = self.builder.get_object('FnRReplaceEntry')
    repstr = repbox.get_text()
    format = buf.register_serialize_tagset()
    data = buf.serialize(buf, format, buf.get_start_iter(), buf.get_end_iter())



    start_bytes = data[0:26]
    size_bytes =data[26:30]
    sizeval = int.from_bytes(size_bytes, byteorder='big', signed=False)

    end_of_markup = 29 + sizeval +1 
    the_rest = data[end_of_markup:len(data)]
    markup = data[30:end_of_markup]

    newmarkup = bytearray(markup.replace(bytes(searchstr,'ascii'),bytes(repstr,'ascii')))

    newsize = len(newmarkup).to_bytes(4,'big')

    reconstruct =start_bytes + newsize + newmarkup +the_rest


    buf.set_text('')
    format = buf.register_deserialize_tagset()
    buf.deserialize(buf, format, buf.get_end_iter(),reconstruct)

Пока это работает без проблем, я сделаю репост, если получу работу с предложением «Метки».Еще раз спасибо theGtknerd.

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