Публикации

PyQt5 - Урок 3. QSystemTrayIcon - Как свернуть приложение в трей

PyQt5 УрокиPyQt5, Pycharm, Qt, QSystemTrayIcon 287

Аналогичная статья на Qt/C++

Одной из первых статей по работе с Qt была статья по работе с QSystemTrayIcon. А теперь настал черёд аналогичного материала, но уже на Python с применением библиотеки PyQt5.

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

Структура проекта в данном случае минимальна. Будет всего лишь один файл, который и будет запускаться. То есть файл __main__.py.

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

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

Читать далее

Евгений Легоцкой  @EVILEG  27 ноября 2016 г. 23:13

Вывод списка популярных статей на Django

Django УрокиDjango, популярные статьи, статистика 514

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

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

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

А теперь давайте разберём пример того, как сделать такой список популярных статей средствами Django

Читать далее

Евгений Легоцкой  @EVILEG  13 ноября 2016 г. 12:04

QML - Урок 1. TextEdit IP Address Validation

QML Урокиip address, ip адрес, lineedit, qlineedit, QLineEdit example, QLineEdit IP Address, qt, qtcreator, qml 664

Доступны аналогичные статьи на Qt/С++ и PyQt5/Python

До полного набора уроков по Qt, на тему валидации IP-адреса дополню статьи также и вариантом на Qt/QML. 

Будет также поле ввода данных, в которое будем вводить IP-адрес. Использоваться для валидации будет RegExpValidator. Одним неприятным моментом в данном случае является то, что подсунуть несколько переменных строки в данный RegExpValidator является довольно нетривиальной задачей, поэтому ограничимся написание регулярки сразу в свойстве regExp у данного объекта.

Читать далее

Евгений Легоцкой  @EVILEG  12 ноября 2016 г. 21:16

PyQt5 - Урок 1. QLineEdit IP Address

PyQt5 Урокиip address, ip адрес, lineedit, qlineedit, QLineEdit example, QLineEdit IP Address, pyqt5, pycharm 524

Доступны аналогичные статьи на Qt/С++ и Qt/QML

При разработке сетевых приложений может потребоваться создание формочки для ввода ip-адреса, но применение простого метода setInputMask(«000.000.000.000;_»); с данным аргументом для QLineEdit не обеспечивает должного результата, поскольку маска позволяет вводить значения 999, 657 и т.д., тогда как IP-адрес ограничивается число 255.

Одним из способов решения данной проблемы является применение Валидатора. 

Подобный урок был реализован на Qt/C++, а теперь тоже самое реализуем на PyQt5/Python.

Читать далее

Евгений Легоцкой  @EVILEG  12 ноября 2016 г. 18:39

Программирование - Индивидуальное предпринимательство и налоговые каникулы - 2016 год

Карьера и бизнес в ITИП, Налоговые каникулы 546

Работа программистом-фрилансером предполагает, что в какой-то момент Вам может понадобиться оформиться официально в качестве юридического лица, в самом простом варианте в качестве Индивидуального Предпринимателя (далее - ИП). Такая необходимость, например, может возникнуть по той причине, что крупному заказчику нужен официальный документооборот с исполнителем, то есть с Вами.

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

Читать далее

Евгений Легоцкой  @EVILEG  12 ноября 2016 г. 10:27

Контактная форма на Django

Django Урокиконтакты, контактная форма, Django 801

Продолжая разработку сайта, хочу поделиться примером кода по добавлению контактной формы на сайте на Django. Уже были статьи с различными формами, например, для добавления комментариев, но раз говорим обо всём процессе в целом, то и не будем обходить и эту тему стороной.

Тем более, что для сайта на Wordpress это было для меня больной темой. Наверное, всему виной была лень, ибо у меня так и не возникло желания начать разбираться с PHP, чтобы набросать контактную форму самостоятельно (в итоге был задействован очередной плагин).

А если учесть, что разработка на Django, предполагает достаточно частую работу с различными формами данных и при этом имеется модуль для работы с почтовыми сервисами, то и добавление подобной формы не представляет особого труда.

Читать далее

Евгений Легоцкой  @EVILEG  15 октября 2016 г. 19:50

Внедрение поиска по сайту с пагинацией результатов

Django УрокиПоиск, Postgres, Search 668

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

Но для того, чтобы выдача поисковых запросов походила больше на главную страницу, добавим возможность пагинации страниц выдачи, а результаты будут выводиться по 10 штук на одной странице. И для этого также будем использовать модуль django_bootstrap3.    

В итоге имеем следующий план действий:

  1. Добавляем приложение для организации поиска;
  2. Добавляем url поиска;
  3. Добавляем форму поиска;
  4. Описываем шаблон страницы поиска.
  5. Описываем представление для обработки выдачи поиска;

Читать далее

Евгений Легоцкой  @EVILEG  4 октября 2016 г. 22:09

Добавление комментариев на сайт с Django

Django УрокиКомментарии, Django, Python, Materialized Path 911

Взявшись за реализацию комментариев на сайте под Django, я с удивлением обнаружил, что Django не предоставляет никаких модулей для реализации комментариев. Вернее он предоставлял его раньше, это был модуль django.contrib.comments, но в версии 1.7 его объявили как deprecated и предложили либо пилить самостоятельно, либо воспользоваться чем-нибудь вроде Disqus. Хорошо, он вроде тоже поддерживает подсветку синтаксиса кода, но... в статьях одна подсветка, в комментариях другая - это будет некрасиво. 

Поэтому будем внедрять собственный велосипед и ловить свои баги.

Для реализации комментариев необходимо:

  • Добавить новую модель, назовём её Comment;
  • Добавить представление, которое будет обрабатывать добавление комментария;
  • Добавить форму для ввода комментария;
  • Воспользоваться для организации древовидной структуры подходом Materialized Path;

Читать далее

Евгений Легоцкой  @EVILEG  30 сентября 2016 г. 22:42

Получение переменных в шаблоне из файла settings.py в Django

Django Урокиsettings.py, SITE_URL, simple_tag 619

В файле settings.py в Django мы храним всю необходимую конфигурационную информацию нашего приложения, в состав которой может входить URL сайта или пути к определённым директориям, в которых хранятся специальный файлы и многая другая информация. 

И иногда требуется данные переменные использовать в шаблонах, тот же самый URL сайта. Но просто прописав в шаблоне эту константу через {{ SITE_URL }}, воспользоваться данной переменной не получится. Одним из способов решения данной задачи является регистрация шаблонных тегов, которые будут выполнять определённый функционал, например забирать атрибут из файла настроек по его имени.

Читать далее

Евгений Легоцкой  @EVILEG  27 сентября 2016 г. 0:06

Materialized Path в PostgreSQL

PostgreSQLMaterialized Path, PostgreSQL 654

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

Распространёнными подходами для организации древовидных структур являются:

Adjacency List
Список смежных вершин

Организация структуры данных заключается в том, что каждый объект хранит информацию о родительском объекте, то есть в строке таблицы имеется дополнительное поле, в котором указывается ID объекта, в который вложен данный объект.
Nested Set
Вложенное множество
Вложенные множества хранят информацию не Только о так называемых левом и правом ключе, а также уровне вложенности. Данный вариант организации структуры данных удобен для чтения, но более тяжело поддаётся модификации.
Materialized Path
Материализованный путь
Идея этой структуры данных заключается в том, что каждая запись хранит полный путь к корневому элементу дерева. 

Рассмотрение этих структур данных было вызвано необходимостью внедрения на сайт поддержки комментариев для статей.

Читать далее

Евгений Легоцкой  @EVILEG  25 сентября 2016 г. 23:37