Доброго здоровья читателям моего канала programmer's notes. Подписываемся и ставим лайки.
tk.Text и простой эмулятор командной строки
tkinter я люблю. Было ощущение, что подборка статей по этой библиотеке какая-то не полная. Я вспомнил, что когда-то я писал что-то вроде такого примтивного эмулятора терминала, используя возможнос tk.Text. Нашел, поубирал всё лишнее, чтобы одним взглядом можно было охватить программу, и решил оформить вот такой статьёй. Мне кажется задача в принципе интересная. Что-то, конечно можно усовершенствовать, но я не стал удлинять и усложнять код. Читатель всегда может сам попробовать усовершенствовать программу или написать полностью свою. Программа, кстати, работает на Linux, а вот на windows - нет. Честно говоря, не разбирался. Библиотеки python иногда такие фокусы выдают.
Окно эмулятора представлено на рисунке 4. Работа простая: набираем команду и нажимаем Enter. Если ошибка, то соотвествующее сообщение. Ввод с клавиатуры не работает. Точнее, всем командам, требующим ввод с клавиатуры (например с использованием команды bash read), засылается пустая строка.
Ниже на рисунках 1-3 фрагменты всей программы, а ниже по ссылке можно получить и всю программу.
Пояснения к фрагменту на рисунке 1.
- Функция run-com() получает 4 параметра: 1-й - выполняемая команда, 2-й - объект редактор tk.Text, 3-й - номер строки (формат строка), откуда взята команда, т.е. вывод команды будет со следующей строки, 4-й - объект само окно.
- out - это выходной поток, err - поток вывода ошибок, если он не пуст, то была ошибка.
- tk.Text.insert() - метод выводит строку (текст) с указанного места. Место указывается строкой, имеющей формат "n.m", где n - номер строки (с единицы), m - номер позиции в строке. В нашем случае позиция в строке 0.
- Метод rowcol() - см. ниже получает текущую строку и положение в строке и присваивает их переменным класса win.
- Метод tk.Text.see("end") - прокручивает редактор в конец текста. Момент важный, так как выводимы текст может быть довольно большим.
- process.communicate() - получает выходные потоки и ро-умолчанию отправляет на вход пустую строку.
Пояснения к фрагменту на рисунке 2.
- Обратим внимание на объект tk.Scrollbar(), который должен быть привязан к редактору: self.text.config(yscrollcommand=sc.set).
- Привязка редактора к окну: self.text.pack(expand=True, fill=tk.BOTH). Важно, для масштабирования редактора в отношении размеров окна используем параметр expand.
- Метод bind() как обычно в tkinter используется для привязки события к обработчику. Ниже разьясняются все обработчики.
Пояснения к фрагменту на рисунке 3.
- Метод rowcol(). Получает строковое выражение для номера текущей строки и символа в строке (метод index()). Параметр "insert" означает, что смотрится индекс последней вставленной (введённой) строки.
- Одна из основных задач блокировать ситуации когда текстовый курсор окажется выше последней строки. Соотвественно обработчик key1(). Команда return 'break' означает, что обработки нажатия не будет.
- Обработчики b1(), b2, m_l() посвящены тому же. Дело в том, курсор может оказаться выше, если попытаться отметить блок. Переменная bt =1, если нажата левая клавиша мыши. При отпускании переменная становится равной 0.
- Обработчик key() отрабатывает нажатие (точнее отпускание) клавиши Enter. По нажатию этой клавиша последняя введённая строка com интерпретируется как команда ОС. sn1 и sn2 это координаты начала и конца строки. sn - индекс строки. Вычитание 1 означает, что текстовый курсор уже перешёл в следующую позицию, а команда находится на предыдущей строке.
Ниже ссылка на полный текст программы
Пока всё!
Пишите свои предложения и замечания, и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.