Python Заметки
2.32K subscribers
58 photos
2 videos
2 files
212 links
Интересные заметки и обучающие материалы по Python

Контакт: @paulwinex

⚠️ Рекламу на канале не делаю!⚠️

Хештеги для поиска:
#tricks
#libs
#pep
#basic
#regex
#qt
#django
#2to3
#source
#offtop
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Опубликовал для вас один из своих учебных проектов моего курса про PySide2 — LaunchPanel.
Это панель, которая выезжает сверху экрана когда к ней подводишь курсор. Содержит кнопки для запуска любых команд.

🔸 можно добавить любые команды
🔸 одна кнопка может содержать много вариантов одной команды. Доступ к ним через контекстное меню
🔸 панель настраивается через файлы конфига

Но самое главное в этом проекте то, что почти каждая строка задокументирована! 😱

Что используется в проекте?

🔸 стилизация виджетов через StyleSheet
🔸 настройка отображения окна как панели без рамок, заголовка и всего остального
🔸 использование файлов конфига
🔸 HTML текст в виджетах
🔸 анимация свойств виджета (позиция и прозрачность)
🔸 реакция виджета на курсор
🔸 запуск подпроцессов

🌎 Исходники забираем здесь

Смотрите, изучайте, пользуйтесь 😉

#qt #source
🙄 Разминка для ума!

Треугольник Серпинского, интересная фигура которую построить достаточно просто.

Алгоритм такой:

1. создаём любые 3 точки на плоскости
2. из этих точек случайно выбираем любую, как начальную
3. случайно выбираем любую точку из этих же трёх точек как цель
4. перемещаемся в сторону цели на половину расстояния
5. повторяем бесконечно с пункта 3

Если сделать достаточно много итераций то вырисовывается интересная фигура. Треугольник, в который вписаны более мелкие треугольники. Это самый настоящий фрактал!

Я собрал пример построения такой фигуры на базе Qt.
🌎 Код можно посмотреть здесь.

С помощью paintEvent я рисую точки по озвученному алгоритму. Каждые 10 секунд либо по клику на виджете строится следующий треугольник.

Особенности примера:

🔸 Атрибут Qt.WA_OpaquePaintEvent позволяет сохранить то, что было нарисовано в прошлой итерации. Таким образом мы видим постепенное наполнение точек а не мелькающую одну точку.
🔸 QTimer позволяет создавать отложенные вызовы один раз или с повторением через интервал.
🔸 QColor.fromHsv() позволяет создать рандомный но предсказуемый цвет с помощью HSV схемы. Не слишком светлый и не слишком тёмный но всегда с разный. Рандомизации подвергается только смещение по цветовому кругу (Hue), яркость (Value) и насыщенность (Saturation) можно контролировать отдельно в своих пределах или оставить статичными. Обычный рандом цвета по RGB не даёт такой предсказуемый результат.
🔸 Каждый новый цикл с новым треугольником предварительно затемняет предыдущие через этот вызов
painter.fillRect(rec, QColor(0, 0, 0, 100))
То есть полупрозрачный цвет. Таким образом, чем старше треугольник, тем он темней.
Если сделать виджет фулскрин, то у нас получится некий ScreenSaver)))
🔸 Да, я знаю, что рисование в Qt не самый лучший способ сделать этот пример) Скорее всего самый НЕподходящий. Попробуйте сделать тоже самое но другими средствами.

#qt #source #tricks
Ранее мы уже говорили о том, как выполнить какой-либо код перед открытием интерактивной консоли.

Расскажу еще один способ! На самом деле, даже запустив интерпретатор в обычном режиме с выполнением скрипта из файла вы можете в любом месте активировать интерактивный режим. Или даже несколько по очереди. За это отвечает модуль code.

Как это может пригодиться?

🔸 Вам не хватает pdb и хочется больше "власти"
🔸 Нужно запросить у юзера данные в достаточно сложном виде. В этом случае можно попросить его создать что ему надо и сохранить в определённую переменную, с которой потом и работать.
🔸 Нужна изолированная среда для выполнения каких-либо действий.
🔸 Просто забавы ради😁

Запускается консоль очень просто

import code
ic = code.InteractiveConsole()
try:
ic.interact()
except SystemExit:
pass

Выход обратно на предыдущий уровень происходит как обычно, вызов функции exit() или клавиши Ctrl+D (Ctrl+Z для Windows).

Я набросал простой пример с некоторым функционалом

🔹 Меняются символы приглашения
🔹 В неймспейсы добавляются дополнительные объекты
🔹 Считается время, проведённое в интерактивном режиме
🔹 Скрипт просит юзера заполнить переменную и по выходу распечатывает её значение

Код здесь ↗️

Для запуска сохраните код в файл и запускайте как обычный скрипт.

python my_console.py

Для быстрого запуска можно сделать отдельный алиас

alias py="python3 /home/username/my_console.py"

#tricks #source
Вы заметили что с интерактивной консолью из прошлого поста что-то не так? Что происходит если нажать стрелки вверх/вниз? Полный бардак!
Давайте поправим это дело!
Для сохранения и загрузки истории будем использовать специальный модуль readline.

Что добавлено?

🔸 Сохранение истории команд с возможностью выбора предыдущих (клавиши ⬆️⬇️ )
🔸 Сохранение истории в файл перед выходом из интерактива для будущих сессий
🔸 Автокомплит по нажатию клавиши TAB
🔸 Cписок вариантов автокомплита по двойному нажатию TAB


Код забираем здесь ↗️

#tricks #source
pkg_img.pyz
8.7 KB
Еще один пример с ресурсами.
Читаем картинку из PYZ архива сразу в QImage и далее используем как иконку в GUI.
Без сохранения в промежуточный файл!

Запускать так:
python3 pkg_img.pyz

▫️Из зависимостей только PySide2.
▫️Помним, что это просто ZIP. То есть исходники можно легко достать из архива.

#source
🤩 Разбираем полезные исходники!

Функция, возвращающая словарь с данными о панели задач.

screen : номер монитора
location : расположение на экране (внизу, слева и тд)
geometry : QRect с координатами таскбара
system_tray : доступен ли системный трей

🔸 Как может пригодиться?
Я использую для открытия виджета по клику на значке в трее с выравниванием по таскбару. Аналогично работает попап у Dropbox клиента.

🔸 Тестил на Windows10 и Debian10.

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

🔸 Ещё в комплекте пример окошка, которое появляется в районе часов над таскбаром.

🔸 Есть один баг. При перекрытии тасбара в Gnome (linux) виджет не получает событий от мыши.
Решения пока не нашел😕

Код забираем здесь ↗️

#source #qt
От многопоточных вычислений переходим к распределённым. То есть вычисления, происходящие на нескольких компьютерах.
Конечно, в зависимости от задачи, вы можете взять готовые решения вроде CGRU или Deadline для рендеринга, charm4py или Dask для ML, или замутить что-то на AWS С2. Но хотелось бы чего-то попроще, попитоничней что ли)

А ведь в Python есть средства "из коробки" для синхронизации нескольких процессов на разных хостах.
Вот простой пример кода, который синхронизирует работу двух процессов на разных компьютерах.

В этом случае используется процесс-посредник, который является синхронизирующим сервером.
В примере создаётся некий Manager, который шарит общую для клиентов очередь. Все подключившиеся могут что-то в неё писать или забирать.
В моём коде один процесс что-то "считает" и складывает в очередь, другой забирает и продолжает какие-то свои "расчёты".

Если у вас есть несколько машин, то можете попробовать это запустить по сети (нужно заменить 'localhost' на IP-адрес сервера). Но и на локальной машине сработает.

Gist 🌎

#libs #source #tricks
Блокировки, они повсюду...
Ох как надоела эта тенденция. Наша IT индустрия буквально стреляет себе в ногу силами определённых личностей и их мнений о том как для нас будет лучше.
Как бы там ни было, сейчас все советуют экстренно качать и переносить свои видосы с YouTube на отечественные аналоги.

Да, можно использовать оконные софты со всеми удобствами (VLC или Youtube Video Downloader), но мы лучше покодим😉

Я набросал небольшой скрипт для скачивания плейлиста с YouTobe в один клик.
Из зависимостей только модуль pytube.

▫️ Для скачивания выбирается максимально доступный размер видео файла.
▫️ Если файл уже существует то скачивания не будет. Удобно для апдейта обновлений.
▫️ Скрипт качает всё из плейлиста с помощью класса pytube.Playlist. Если хотите скачать канал, то просто замените класс на pytube.Channel

from pytube import Channel
PLAYLIST_URL = 'https://www.youtube.com/channel/XXXXXXXXX'
playlist = Channel(PLAYLIST_URL)

Забираем здесь ➡️

#source
👍21
This media is not supported in your browser
VIEW IN TELEGRAM
Прошлый пост про печать появился неспроста!
Недавно мне потребовалось напечатать большую версию чертежа. Нужен был инстурмент, аналогичный многостраничной печати в CorelDraw но под Linux.
Поэтому я решил ... чтобывыдумали???... да, сделать свой велосипед 😂

И вот что у меня вышло.

➡️ Tile Printer

▫️Интерактивное позиционирование картинки
▫️Отправка на печать или сохранение в файлы
▫️Настройка отступов
▫️Можно указать DPI

ЗЫ. Не судите строго, сделано всё за 1 день.
ЗЗЫ. Да, я гуглил аналоги. Самый советуемый инструмент posterazor не подошел по функционалу. Остальные не стоят внимания.

#source
8🤩3
Доделал свой старый проект - инструмент для восстановления ориентации объектов в пространстве на основе опорных компонентов. Работает в Autdesk Maya.

Основные возможности.

▫️просто выделите опорные (обычно симметричные или осевые) компоненты и укажите куда их ориентировать
▫️ операции для доворотов и центрирования
▫️ восстановление исходного расположения после восстановления трансформаций
▫️работает как с одним объектом так и с группой
▫️ открытый API для интеграций с другими инструментами и автоматизаций

Все действия происходят с векторами и матрицами объектов, поэтому всё достаточно быстро.

Где может применяться?

🪑Нередкая проблема - собрали лейаут сцены и зафризили, или даже смержили всю геометрию в один большой меш. Требуется вернуть все объекты в "Т-позу", сохранить отдельно и расставить обратно в сцену, но с правильными трансформациями.
Инструмент как раз заточен под такую работу.

🌲Заскатерили инстансы и потом конвертнули в меш. Нужно обратно преобразовать в инстансы. Здесь поможет API который восстановит положение каждого инстанса в нуле и вернёт его обратно в исходное положение, но с правильными трансформациями. Останется забрать матрицу с объекта для инстанса.

Быстрое превью функционала:
▶️ https://www.youtube.com/watch?v=JvlHa0NEXu8

Документация и код здесь:
🌍 https://github.com/paulwinex/pw-maya-restore-orient

#release #source
🔥10👍54