Найти в Дзене
programmer's notes (python and more)

Программирование на python. Библиотека tkinter и простой эмулятор командной строки

Доброго здоровья читателям моего канала programmer's notes. Подписываемся и ставим лайки.

tk.Text и простой эмулятор командной строки

tkinter я люблю. Было ощущение, что подборка статей по этой библиотеке какая-то не полная. Я вспомнил, что когда-то я писал что-то вроде такого примтивного эмулятора терминала, используя возможнос tk.Text. Нашел, поубирал всё лишнее, чтобы одним взглядом можно было охватить программу, и решил оформить вот такой статьёй. Мне кажется задача в принципе интересная. Что-то, конечно можно усовершенствовать, но я не стал удлинять и усложнять код. Читатель всегда может сам попробовать усовершенствовать программу или написать полностью свою. Программа, кстати, работает на Linux, а вот на windows - нет. Честно говоря, не разбирался. Библиотеки python иногда такие фокусы выдают.

Окно эмулятора представлено на рисунке 4. Работа простая: набираем команду и нажимаем Enter. Если ошибка, то соотвествующее сообщение. Ввод с клавиатуры не работает. Точнее, всем командам, требующим ввод с клавиатуры (например с использованием команды bash read), засылается пустая строка.

Ниже на рисунках 1-3 фрагменты всей программы, а ниже по ссылке можно получить и всю программу.

Рисунок 1. Функция обработки команды операционной системы. Текст всей программы ниже по ссылке
Рисунок 1. Функция обработки команды операционной системы. Текст всей программы ниже по ссылке

Пояснения к фрагменту на рисунке 1.

  • Функция run-com() получает 4 параметра: 1-й - выполняемая команда, 2-й - объект редактор tk.Text, 3-й - номер строки (формат строка), откуда взята команда, т.е. вывод команды будет со следующей строки, 4-й - объект само окно.
  • Для запуска команды используется библиотечный метод subprocess.Popen(). См. здесь и здесь.
  • out - это выходной поток, err - поток вывода ошибок, если он не пуст, то была ошибка.
  • tk.Text.insert() - метод выводит строку (текст) с указанного места. Место указывается строкой, имеющей формат "n.m", где n - номер строки (с единицы), m - номер позиции в строке. В нашем случае позиция в строке 0.
  • Метод rowcol() - см. ниже получает текущую строку и положение в строке и присваивает их переменным класса win.
  • Метод tk.Text.see("end") - прокручивает редактор в конец текста. Момент важный, так как выводимы текст может быть довольно большим.
  • process.communicate() - получает выходные потоки и ро-умолчанию отправляет на вход пустую строку.
Рисунок 2. Начало класса окна с редактором
Рисунок 2. Начало класса окна с редактором

Пояснения к фрагменту на рисунке 2.

  • Класс win является наследником tk.Tk, т.е. типичным окном tkinter. См. здесь.
  • Обратим внимание на объект tk.Scrollbar(), который должен быть привязан к редактору: self.text.config(yscrollcommand=sc.set).
  • Привязка редактора к окну: self.text.pack(expand=True, fill=tk.BOTH). Важно, для масштабирования редактора в отношении размеров окна используем параметр expand.
  • Метод bind() как обычно в tkinter используется для привязки события к обработчику. Ниже разьясняются все обработчики.
Рисунок 3. Обработчики событий
Рисунок 3. Обработчики событий

Пояснения к фрагменту на рисунке 3.

  • Метод rowcol(). Получает строковое выражение для номера текущей строки и символа в строке (метод index()). Параметр "insert" означает, что смотрится индекс последней вставленной (введённой) строки.
  • Одна из основных задач блокировать ситуации когда текстовый курсор окажется выше последней строки. Соотвественно обработчик key1(). Команда return 'break' означает, что обработки нажатия не будет.
  • Обработчики b1(), b2, m_l() посвящены тому же. Дело в том, курсор может оказаться выше, если попытаться отметить блок. Переменная bt =1, если нажата левая клавиша мыши. При отпускании переменная становится равной 0.
  • Обработчик key() отрабатывает нажатие (точнее отпускание) клавиши Enter. По нажатию этой клавиша последняя введённая строка com интерпретируется как команда ОС. sn1 и sn2 это координаты начала и конца строки. sn - индекс строки. Вычитание 1 означает, что текстовый курсор уже перешёл в следующую позицию, а команда находится на предыдущей строке.
Рисунок 4. Окно эмулятора
Рисунок 4. Окно эмулятора

Ниже ссылка на полный текст программы

primer386.py

Пока всё!

Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.

Вы мне кнопочки тут не жмите. Вы мне напишите команду в командной строке
Вы мне кнопочки тут не жмите. Вы мне напишите команду в командной строке