Створюємо оточення для PyQt5 в Linux MInt (Ubuntu)

imageimageimage
Давно вже до п'ятої версії оновився Qt і разом з ним PyQt, але знайти інформацію про них в російськомовному сегменті — завдання не з простих. Під катом докладний туторіал для тих, хто тільки починає знайомитися зі зв'язкою Qt + python3.

Мета: зібрати і налаштувати оточення, пройти шлях від установки PyQt5 і створення форми в Qt Designer до запуску стерпного бінарника.



установки
Виходячи з того, що ми — зовсім новачки, я постараюся використовувати шляху в системі, які використовуються за замовчуванням, або які ми створимо виходячи з наступної логіки розміщення:
  • Всі необхідні файли і папки зберігаються в директорії dev в домашній директорії користувача, тобто ~/dev/
  • Ми будемо використовувати віртуальні оточення для пітона, і зберігати їх будемо в директорії envs, тобто ~/dev/envs/
  • Наші проекти будуть зберігатися в директорії src, тобто ~/dev/src/
Якщо у вас вже склалася власна ієрархія розміщення файлів, то доведеться скорегувати шляхи в командах, наведених нижче.

Налаштування оточення
Створюємо структуру директорій. Відкрийте консоль і виконайте:
cd ~
mkdir-p dev/envs dev/src
cd dev/envs

Ставимо пакет, який знадобиться нам для складання в майбутньому:
sudo apt-get install python3-dev

Ставимо pip і virtualenv:
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
rm get-pip.py
sudo pip install virtualenv

Створюємо віртуальне оточення, активуємо його і оновлюємо пакети:
virtualenv --prompt="[pyqt5] " pyqt5
source pyqt5/bin/activate
pip install-U pip setuptools

Ставимо Qt5. При виборі шляху установки я залишив «за замовчуванням» ~/Qt. Якщо Ви виберіть інший, то необхідно міняти шляху в командах нижче:
# Для x64-архітектури
# http://www.qt.io/download-open-source/#section-2
wget http://download.qt-project.org/official_releases/online_installers/qt-opensource-linux-x64-online.run
chmod u+x qt-opensource-linux-x64-online.run
./qt-opensource-linux-x64-online.run
rm qt-opensource-linux-x64-online.run

# Для x86-архітектури
# http://www.qt.io/download-open-source/#section-2
# wget http://download.qt-project.org/official_releases/online_installers/qt-opensource-linux-x86-online.run
# chmod u+x qt-opensource-linux-x86-online.run
# ./qt-opensource-linux-x86-online.run
# rm qt-opensource-linux-x86-online.run

Ставимо SIP — модуль, необхідний для роботи PyQt:
# http://www.riverbankcomputing.com/software/sip/download
wget http://sourceforge.net/projects/pyqt/files/sip/sip-4.16.5/sip-4.16.5.tar.gz
tar xvzf sip-4.16.5.tar.gz
cd sip-4.16.5/
python configure.py -d ~/dev/envs/pyqt5/lib/python3.4/site-packages/
make
sudo make install
sudo make clean
cd ..
rm-rf sip*

Ставимо PyQt:
wget http://sourceforge.net/projects/pyqt/files/PyQt5/PyQt-5.4/PyQt-gpl-5.4.tar.gz
tar xvzf PyQt-gpl-5.4.tar.gz
cd PyQt-gpl-5.4/
# У мене під рукою тільки x64-архітектура, тому моя команда виглядає саме так.
# Якщо ж у вас x86, то шлях ~/Qt/5.4/gcc_64/bin/qmake буде виглядати інакше.
# Буду вдячний, якщо в коментарях підкажуть, як саме
python configure.py --destdir ~/dev/envs/pyqt5/lib/python3.4/site-packages/ --qmake ~/Qt/5.4/gcc_64/bin/qmake
make
sudo make install
sudo make clean
cd ..
rm-rf PyQt*

На цьому все. Оточення встановлено та готове до роботи. Для перевірки виконайте команду:
python-c "from PyQt5.QtCore import QT_VERSION_STR;from PyQt5.Qt import PYQT_VERSION_STR;from sip import SIP_VERSION_STR;print('Qt version: ',QT_VERSION_STR);print('SIP version: ',SIP_VERSION_STR);print('PyQt version: ',PYQT_VERSION_STR)"

Відповідь має виглядати наступним чином:
Qt version: 5.4.0
SIP version: 4.16.5
PyQt version: 5.4

Для перевірки, що все дійсно встановилося в віртуальне оточення, відкрийте нове вікно терміналу і повторіть команду перевірки:

У відповідь повинна з'явитися помилка ImportError. Нове вікно терміналу після цього можна закрити.

Створення програми
Перейдемо в директорію з нашими першоджерелом і створимо директорію проекту:
cd ../src/
mkdir pyqt_test
cd pyqt_test/

Далі нам потрібно Qt Designer. Якщо Ви не змінювали нехай установки Qt, запустити його можна командою:
# І знову ця команда буде працювати тільки для x64-архітектури.
# Для x86 замість gcc_64 найімовірніше буде інша директорія.
~/Qt/5.4/gcc_64/bin/designer

Ось так виглядає запущений Qt Designer на моїй системі:

В даному посібнику я не буду детально зупинятися на описі інтерфейсу дизайнера, ми пройдемо найпростіший шлях до мінімальної готової форми. Якщо Вам необхідна більш детальна інформація — Google It!

У діалоговому вікні вибираємо «Widget» (останній пункт у списку «templates/forms») і натискаємо кнопку «Створити». Відкриється форма редагування віджета:


Перетягніть на форму кнопку меню зліва і збережіть отриману форму з ім'ям test.ui в директорію ~/dev/src/pyqt_test/:

Tips&Tricks: Натиснувши [Ctrl + R] Ви можете запустити свою форму і «помацати» її в режимі реального часу.

Конвертований файл інтерфейсу з XML форми в зрозумілу python форму:
pyuic5 test.ui > test_ui.py

Я не хочу редагувати що в файлі, створеному конвертером PyQt, тому наші слоти ми опишемо в окремому файлі. Створіть файл test_slots.py і відкрийте його в улюбленому Вами редакторі. Наповнення файлу повинна виглядати приблизно так:
"""
Користувальницькі слоти для віджетів.
"""
# Імпортуємо модуль часу
from datetime import datetime
# Імпортуємо клас інтерфейсу з створеного конвертером модуля 
from test_ui import Ui_Form


# Створюємо власний клас, наследуясь від автоматично згенерованого
class MainWindowSlots(Ui_Form):

# Визначаємо користувальницький слот
def set_time(self):
# Отримуємо поточну мітку часу в форматі 'Ч:М:
str_time = datetime.now().strftime('%H:%M:%S')
# Присвоюємо напису на кнопці мітку часу
self.pushButton.setText(str_time)
return None


Потім, створіть ще один файл з ім'ям main.py, в якому ми опишемо основну логіку:
"""
Основний скрипт програми.
Запускає конфігуратор вікна, підключає слоти і відображає вікно.
"""
# Імпортуємо системый модуль для коректного закриття програми
import sys
# Імпортуємо мінімальний набір віджетів
from PyQt5.QtWidgets import QApplication, QWidget
# Імпортуємо створений нами клас зі слотами
from test_slots import MainWindowSlots


# Створюємо ще один клас, наследуясь від класу зі слотами
class MainWindow(MainWindowSlots):

# При ініціалізації класу нам необхідно выпонить деякі операції
def __init__(self, form):
# Налаштувати інтерфейс методом з базового класу Ui_Form
self.setupUi(form)
# Підключити створені нами слоти до віджетів
self.connect_slots()

# Підключаємо слоти до віджетів
def connect_slots(self):
self.pushButton.clicked.connect(self.set_time)
return None

if __name__ == '__main__':
# Створюємо екземпляр програми
app = QApplication(sys.argv)
# Створюємо базове вікно, в якому буде відображатися наш UI
window = QWidget()
# Створюємо екземпляр нашого UI
ui = MainWindow(window)
# Відображаємо вікно
window.show()
# Обробляємо натискання на кнопку вікна "Закрити"
sys.exit(app.exec_())

На цьому наше додаток завершено. Виконавши з консолі
python main.py

ми повинні побачити форму з кнопкою посередині, натискання на яку змінює назву кнопки на системну дату.


Упаковка в виконуваний файл для Linux
Пакувальник вимагає деякої магії при установці.
Викачуємо пакет, не встановлюючи його і розпаковуємо:
cd ../../envs/pyqt/
pip install-d . cx_freeze
tar xvfz cx_Freeze-4.3.4.tar.gz

Відкриваємо улюбленим редактором файл cx_Freeze-4.3.4/setup.py. Я використовую SublimeText:
subl cx_Freeze-4.3.4/setup.py

Правимо рядок №84, щоб вона виглядала, як на картинці:

Tips&Tricks: А ви знали, що якщо запустити SublimeText з віртуального оточення, то інтерпретатором за замовчуванням буде з віртуального оточення?

Зберігаємо зміни, закриваємо редактор, встановлюємо пакет, повертаємося в папку з исходниками, запускаємо упаковку:
cd cx_Freeze-4.3.4
python setup.py install
rm ../cx_Freeze-4.3.4.tar.gz
cd ../../../src/pyqt_test
cxfreeze main.py

Після цього в директорії з исходниками з'явиться директорія dist, в якій серед безлічі файлів можна помітити файл без розширення main — це і є наш бінарники, готовий для запуску і перенесення. Відверто кажучи, трохи засмучує розмір дістрібьютіва: на моїй машині це — 70,1 Мб, але не варто забувати, що туди упаковані: python, PyQt, Qt і деякі загальносистемні бібліотеки. Складальний скрипт cxfreeze досить гнучко конфігурується, але підбір оптимальних параметрів я залишу на совісті читача. Скажу тільки, що щастя полягає в стисненні, оптимізації та ручному обмеження залежностей.

P. S.: Всі вихідні коди на GitHub'е

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.