На Python, используя среду Glade напишем программу (заготовку) для работы с текстом.

 Запустите IDE Glade, создайте новый проект.

Создайте Окно класса GtkWindow, на вкладке Основные свойства присвойте ему идентификатор ID: window. Там же, на вкладке Основные свойства присвойте окну Заголовок Текстовый редактор и проставьте галочки Ширина по умолчанию и Высота по умолчанию. На вкладке Сигналы в разделе GtkWidget событию destroy задайте обработчик on_destroy.

Поверх окна window разместите Контейнер GtkBox. На вкладке Основные свойства укажите Количество элементов: 2. 

В верхней части контейнера GtkBox разместите контейнер GtkScrolledWindow. На вкладке Общие свойства поставьте галочку Раскрыть По вертикали, включите переключатель и выберите Выравнивание По вертикали Заполнение.

В нижней части контейнера GtkBox разместите контейнер GtkButtonBox, с атрибутами на вкладке Основные свойства Ориентация: ГоризонтальноКоличество элементов 4. На вкладке Общие свойства поставьте галочку Раскрыть По горизонтали, включите переключатель и выберите Выравнивание По вертикали По центру.

В контейнере GtkScrolledWindow разместите элемент Окно GtkTextView. На вкладке Основные свойства создайте Буфер с именем textbuffer1.

В контейнере GtkButtonBox разместите 4 кнопки Control GtkButton. На вкладке Основные свойства для каждой кнопки задайте надписи: Копировать, Очистить, Вставить, Добавить. На вкладке Сигналы событию clicked задайте обработчики для кнопки с надписью Копировать click_btn_cp, Очистить click_btn_cl, Вставить click_btn_ins, Добавить click_btn_apnd.

В IDE Glade сохраните проект под именем, например, examle. В результате вы получите файл example.glade:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
  <requires lib="gtk+" version="3.20"/>
  <object class="GtkTextBuffer" id="textbuffer1"/>
  <object class="GtkWindow" id="window">
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">Текстовый редактор</property>
    <property name="default_width">440</property>
    <property name="default_height">250</property>
    <signal name="destroy" handler="on_destroy" swapped="no"/>
    <child>
      <placeholder/>
    </child>
    <child>
      <object class="GtkBox">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="orientation">vertical</property>
        <child>
          <object class="GtkScrolledWindow">
            <property name="visible">True</property>
            <property name="can_focus">True</property>
            <property name="vexpand">True</property>
            <property name="shadow_type">in</property>
            <child>
              <object class="GtkTextView">
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="buffer">textbuffer1</property>
              </object>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkButtonBox">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="halign">center</property>
            <property name="hexpand">True</property>
            <property name="layout_style">start</property>
            <child>
              <object class="GtkButton">
                <property name="label" translatable="yes">Копировать</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="click_btn_cp" swapped="no"/>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">0</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton">
                <property name="label" translatable="yes">Очистить</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="click_btn_cl" swapped="no"/>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">1</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton">
                <property name="label" translatable="yes">Вставить</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="click_btn_ins" swapped="no"/>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">2</property>
              </packing>
            </child>
            <child>
              <object class="GtkButton">
                <property name="label" translatable="yes">Добавить</property>
                <property name="visible">True</property>
                <property name="can_focus">True</property>
                <property name="receives_default">True</property>
                <signal name="clicked" handler="click_btn_apnd" swapped="no"/>
              </object>
              <packing>
                <property name="expand">True</property>
                <property name="fill">True</property>
                <property name="position">3</property>
              </packing>
            </child>
          </object>
          <packing>
            <property name="expand">False</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
</interface>

В текстовом редакторе или, например, в IDE IDLE напишите программу example.py следующего содержания:

#!/usr/bin/env python
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: t; c-basic-offset: 4; tab-width:$

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GdkPixbuf, Gdk
import os, sys, random
XML_FILE = "example.glade"
txt = ""

class Handler:
    def on_destroy(self, *args):
        print("Программа завершена")
        Gtk.main_quit()

    def click_btn_cp(self, button):
        global txt, txtbuf
        txt = txtbuf.get_text(txtbuf.get_start_iter(), txtbuf.get_end_iter(), False)

    def click_btn_cl(self, button):
        global txt, txtbuf
        txtbuf.set_text("")

    def click_btn_ins(self, button):
        global txt, txtbuf
        txtbuf.set_text(txt)

    def click_btn_apnd(self, button):
        global txt, txtbuf
        txt = txt + txtbuf.get_text(txtbuf.get_start_iter(), txtbuf.get_end_iter(), False)
        txtbuf.set_text(txt)

builder = Gtk.Builder()
builder.add_from_file(XML_FILE)
builder.connect_signals(Handler())
window = builder.get_object("window")
window.show_all()
txtbuf = builder.get_object("textbuffer1")
Gtk.main()

Наш проект состоит их 2-х файлов example.py иexample.glade. Теперь можно запускать нашу программу через терминал в папке проекта или через IDE IDLE:

dior@U18pro:~/Python/Example/Gtk TextView v03$ ./example.py

Работает: