На 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
Работает: