Пример создания небольшого GUI хеллоу ворлда используя PySide2 (Qt) на Windows (кроссплатформенно).
Для установки зависимостей и создания virtualenv используется poetry https://poetry.eustace.io/docs/
В зависимостях есть всё нужное для работы скриптов.
Графический редактор ui файлов (Qt Designer) устанавливается отдельно: либо инсталятором С++ Qt отсюда https://www.qt.io/download (кнопка справа про опенсорс), либо тут он доступен без всего лишнего https://build-system.fman.io/qt-designer-download (не пробовал).
Видео всего процесса. 5:49, без звука (в таком формате особо нечего говорить, цели полностью объяснить все основы не было):
Код:
Вместо генерации Питоновского кода из .ui файлов, их можно сразу загружать https://doc.qt.io/qtforpython/tutorials/basictutorial/uifiles.html#loading-it-directly, но мне так не особо понравилось. Может не разобрался, а может не допилили еще, Pyside2 недавно начали развивать, до этого PyQt5 был основным. Основные проблемы вроде были в том, что неудобно добавлять обработчики событий (нельзя просто создать метод с @Slot) и непонятно как переопределять методы (например paintEvent). Я находил какие-то решения, но они выглядели как-то сложно и/или добавляли другие проблемы. Ну и так не будет подсказок IDE про элементы виджета (self.ui.myMegaButton).
Вызовы pyside2-uic естественно можно автоматизировать кучей способов типа скриптов, Makefile, средств IDE.
В одном проекте я просто создал скрипт перегенирирующий все файлы и запускал его вручную когда надо:
import inspect
import os
import re
def read_all_file_text(file_path, encoding='utf-8'):
with open(file_path, 'r', encoding=encoding) as f:
return f.read()
def write_all_file_text(file_path, text, encoding='utf-8'):
with open(file_path, 'w', encoding=encoding) as f:
return f.write(text)
dir_path = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
filenames = [f for f in os.listdir(dir_path) if f.endswith('.ui')]
for filename in filenames:
input_path = os.path.join(dir_path, filename)
output_path = os.path.join(dir_path, 'ui_' + os.path.splitext(filename)[0] + '.py')
cmd = f'pyside2-uic "{input_path}" > "{output_path}"'
print(cmd)
ret = os.system(cmd)
if ret != 0:
print(f'Exit code {ret}')
continue
# remove header
src = read_all_file_text(output_path)
clean_src = re.sub(r'# Form implementation generated.+(# WARNING! All changes made in this file will be lost!)',
r'\g<1>', src, flags=re.S)
write_all_file_text(output_path, clean_src)
Скрипт еще убирает коммент с датой потому что я коммитил их в Гит (конечно наверно лучше добавить их в .gitignore и просто генерировать после git clone и т.д., но в том случае так было удобнее по каким-то причинам).