03.22 Git и ssh-ключи; tkinter: Text и Canvas
- SSH
- Коротко о ssh
- Терминальный доступ
Заход на ssh prac.cs.msu.ru
Настройка доступа по ключу (см. лекцию)
Добавление ключа в агент (на машине прака он уже запущен)
- Создание, клонирование и pus/pull bare-репозитория
Если успеем — регистрация ключей на персональном git-портале (на примере git.cs.msu.ru)
- Коротко о ssh
Tkinter Text
Координаты, маркеры, теги + см. лекцию
Загрузить в Text текстовый файл, в котором все слова с названиями цветов перекрасить в соответствующий цвет.
- Названия цветов
В Linux-системе в файле /usr/share/X11/rgb.txt
В vim-е $VIMRUNPATH/rgb.txt
- Правильно:
предварительно в цикле задать "foreground" для тегов с именами цветов,
а потом при загрузке текста определять, является ли слово цветом, и метить его тегом (точнее, использовать .insert() с тегом
- Названия цветов
Tkinter Canvas
Общая структура: список векторных объектов, которые при отрисовке выводятся по очереди
Создание объекта: линии, дуги, овалы, прямоугольники и т. п.
Cписок объектов — .findall()
Сами объекты из питона непосредственно не видны, обращение только по индексу или тегу
Поиск объектов .find_closest(…)/.find_overlapping(…)
- Работа с объектом после создания
Запрос типа объекта — .type(номер-или-тег)
Запрос свойств объекта — .itemconfigure(номер-или-тег)
Изменение свойств объекта — .itemconfigure(номер-или-тег, свойство=значение, …)
Перемещение .move()
Удаление .delete(номер-или-тег)
- …
- Теги, выделение, текст, чёрт в ступе…
Нарисовать несколько овалов и забиндить на "<Motion>" правильный .move(), чтобы внезапно их можно было таскать
Подсказка используем три События
"<Button>" для начала перетаскивания
"<Motion>" с проверкой, что кнопка нажата (вот тут в конце)
.find_overlapping(…) на координаты, которые в событии приехали, получаем объект,
- вспоминаем координаты из предыдущего события,
- сдвигаем объект на разницу
"<ButtonRelease>" перетаскивание выключаем
Задача_1: Напишите программу-интерпретатор языка CCL (Canvas Control Language, название вымышленное), описывающего объекты для отрисовки в виджете Canvas.
- программа на языке CCL - это текст, каждая строка которого имеет один из следующих видов:
#sometext (sometext - произвольный текст из 0 или более символов) - комментарий
object par1 par2 par3 ... - описание объекта для отрисовки на Canvas: object - имя объекта, после имени объекта - список параметров объекта с разделителем-пробелом; например:
oval 1 5 15 20.1 outline='yellow'
oval 2 -3 10 11.3 width=2.0
- пятый параметр — ширина outline
rectangle 1.5 2.5 10 20 fill='red' dimple='grey75'
line 2 2 10 5 5 3 dash=(4,8)
- также допустимы пустые строки, не содержащие ничего кроме пробелов и знаков табуляции, в т.ч. совсем пустые строки
- ваша программа должна иметь интерфейс:
в левой части окна - область ввода (виджет Text), в которой редактируется CCL-программа
в правой части окна - область отрисовки (виджет Canvas), в которой отображается результат выполнения CCL-программы
- внизу от области ввода - текстовая метка с подсказкой по оператору CCL
кнопки RUN и CLEAR
- ваша программа должна реализовывать следующую функциональность:
поддержка следующих объектов: oval, rectangle, line (на занятии достаточно сделать поддержку oval)
- синтаксическая подсветка: строки, начинающиеся с имени поддерживаемого объекта или с "#", отображаются зеленым шрифтом; непустые строки, начинающиеся с чего-либо другого, отображаются красным шрифтом
вывод подсказки по операторам CCL: при наведении мыши на строку, начинающуюся с имени поддерживаемого объекта, в текстовой метке отображается подсказка "Draw <имя объекта>", например "oval x0 y0 x1 y1 outline='color' fill='color'"
по нажатию кнопки RUN: очистка области отрисовки, затем последовательная обработка всех строк с описанием поддерживаемых объектов, с отрисовкой каждого из них на Canvas
по нажатию кнопки CLEAR: очистка области отрисовки
Подсказка: синтаксис CCL в точности соответствует синтаксису вызова соответствующего метода, поэтому для отрисовки достаточно проверить, что объект поддерживается и сформировать eval():
- программа на языке CCL - это текст, каждая строка которого имеет один из следующих видов:
name, *parameters = line.split() if name in known_names: try: eval(f"mycanvas.create_{name}({','.join(parameters)})") except: # пометить строку как ошибочную else: # пометить строку как ошибочную
Д/З
Выполнить упражнения из плана занятия (для тренировки)
Решить Задачу 1