Você pode realmente fazer isso usando um widget TextView. Primeiro você deve definir editable para true:
textview.set_editable(true)
Você precisará obter seu textbuffer, que são os dados das textviews:
buffer = textview.get_buffer()
Em seguida, usando esse buffer, você pode obter e definir os dados nele. para obter o texto atualmente no uso do buffer:
buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter(), false)
O primeiro e o segundo argumentos são o intervalo para obter o texto, neste caso tudo fora. O último argumento especifica se você deseja obter caracteres ocultos, neste caso, false. Para inserir texto, você pode usar o seguinte:
buffer.insert(buffer.get_end_iter(), "Sample text")
O primeiro argumento especifica onde inserir o texto, neste caso no final. o segundo argumento é o texto a ser inserido. Para substituir todos os dados no buffer, você pode usar:
buffer.set_text("Sample text")
Isso substituirá tudo no buffer por "Texto de amostra". Para inserir uma imagem você precisa criar um pixbuf para fazer isso, use o seguinte:
pixbuf = gtk.gdk.pixbuf_new_from_file(filename)
Para redimensionar o uso do pixbuf:
pixbuf.scale_simple(dest_width, dest_height, gtk.gdk.INTERP_BILINEAR)
Os dois primeiros argumentos são a nova largura e altura, o terceiro argumento é o tipo de interpolação que controla como ele é dimensionado (existem quatro tipos que podem ser encontrados aqui ). Você pode então adicionar este pixbuf ao buffer usando:
buffer.insert_pixbuf(buffer.get_end_iter(), pixbuf)
Isto irá inserir uma imagem no final do buffer.
Você também pode fazer coisas como adicionar widgets, definir margens, copiar e colar da área de transferência, inserir no cursor, etc., mas pode ver os links abaixo para isso.
Editar : Para um salvamento / carregamento formatado, você pode usar o método de serialização de textbuffers. Primeiro você deve usar o método register_serialize_tagset ():
format = buffer.register_serialize_tagset()
Em seguida, você pode usar o método serialize para obter os dados serializados:
data buffer.serialize(buffer, format, buffer.get_start_iter(), buffer.get_end_iter())
Isso retornará os dados no formato interno do textbuffer, que você pode salvar em um arquivo. Para carregar estes dados, primeiro chame o método register_deserialize_tagset () do textbuffer:
format = emptyBuffer.register_deserialize_tagset()
Então você pode carregar os dados usando o método deserialize ():
emptyBuffer.deserialize(emptyBuffer, format, emptyBuffer.get_end_iter(), data)
Isso carregará os dados no textbuffer.
Edit2 : se você quiser que o usuário arraste para mover e redimensionar, carregue o pixbuf em um widget de imagem, o widget de imagem em uma caixa de evento, a caixa de evento em uma âncora filha para colocar na visualização de texto, você pode manipular x eventos para esse widget e escrever código nos manipuladores para mover ou redimensionar a imagem.
Recursos: