Привет, Хабр! Сегодня я вас хочу научить делать интерфейс на Python 3&PyQt5.
Установка PyQt5
Для того, чтобы установить PyQt5 в Windows или MacOS, откройте Командную строку или Терминал и введите:
pip3 install PyQt5Для Linux, откройте Терминал и введите:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-pyqt5Hello, World!
А сейчас сделаем Hello World приложение. Создайте файл Python, откройте его и введите такой код:
from PyQt5.QtWidgets import *
import sys
class MainWindow(QMainWindow): # главное окно
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi()
    def setupUi(self):
        self.setWindowTitle("Hello, world") # заголовок окна
        self.move(300, 300) # положение окна
        self.resize(200, 200) # размер окна
        self.lbl = QLabel('Hello, world!!!', self)
        self.lbl.move(30, 30)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())Когда вы запустите, должна получится примерно такая картина:

Меняем шрифт надписи
А теперь поменяем шрифт надписи. Теперь код станет таким:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class MainWindow(QMainWindow): # главное окно
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi()
    def setupUi(self):
        self.setWindowTitle("Hello, world") # заголовок окна
        self.move(300, 300) # положение окна
        self.resize(200, 200) # размер окна
        self.lbl = QLabel('Hello, world!!!', self)
        self.lbl.move(30, 30)
        self.font = QFont() # создаём объект шрифта
        self.font.setFamily("Rubik") # название шрифта
        self.font.setPointSize(12) # размер шрифта
        self.font.setUnderline(True) # подчёркивание
        self.lbl.setFont(self.font) # задаём шрифт метке
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())
Пример рассчитан на то, что у вас уже установлен шрифт Rubik от Google Fonts. Если нет, его всегда можно скачать отсюда.
Более продвинутая разметка с XHTML
А теперь добавим XHTML. Например, так:
from PyQt5.QtWidgets import *
import sys
class MainWindow(QMainWindow): # главное окно
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi()
    def setupUi(self):
        self.setWindowTitle("Hello, world") # заголовок окна
        self.move(300, 300) # положение окна
        self.resize(200, 200) # размер окна
        self.lbl = QLabel('<i>Hello</i>, <b>world</b>!!! <s><b>123</b></s>', self)
        self.lbl.move(30, 30)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())
Те, кто хотя бы немного знают XHTML, заметят, что надпись Hello сделана курсивом, слово world - жирным, а 123 - и вычеркнуто, и жирное.
Шпаргалка по XHTML
| <b>123</b> | Жирный текст | 
| <i>123</i> | Курив | 
| <u>123</u> | Подчёркивание | 
| <s>123</s> | Вычёркивание | 
| <code>123</code> | Код (моноширным шрифтом) | 
| <sup>123</sup> | Надстрочный текст | 
| <sub>123</sub> | Подстрочный текст | 
| <span style="font-size:16pt;">123</span> | Размер текста 16 пунктов | 
| <span style="color:#cc0000;">123</span> | Красный текст | 
| <span style=" background-color:#00ff00;">123</span> | Текст на ярко-зелёном фоне. | 
| <span align="center">123</span> | Выравнивание по центру | 
Кстати, я знаю такой конструктор HTML. Лично мне он по душе. Только сложно вставлять свои тэги.
Больше надписей!
А теперь сделаем 2 надписи:
from PyQt5.QtWidgets import *
import sys
class MainWindow(QMainWindow): # главное окно
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi()
    def setupUi(self):
        self.setWindowTitle("Hello, world") # заголовок окна
        self.move(300, 300) # положение окна
        self.resize(200, 200) # размер окна
        self.lbl = QLabel('<i>Hello</i>, <b>world</b>!!!', self)
        self.lbl.move(30, 30)
        self.lbl2 = QLabel('<u>Ещё одна метка</u>', self)
        self.lbl2.move(50, 50)
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = MainWindow()
    win.show()
    sys.exit(app.exec_())На вторую я тоже добавил форматирование (подчёркивание), а у первой убрал 123.
Окно без resize()
Все предыдущие примеры использовали такую конструкцию:
self.resize(200, 200)Но без этой конструкции можно обойтись, так как виджеты будут сами себе расчищать место.
Подсказки
Ко всем виджетам можно добавить подсказку. Например (привожу только важную для понимания часть кода):
self.lbl.setToolTip('This is a <b>QLabel</b>')Эпилог
Вот и всё. В следующей части я постараюсь описать кнопки, меню и события.
До новых встреч!
Комментарии (20)
 - DeepFakescovery12.02.2022 12:20+1- лучше писать уроки на свежем pyqt6 . - Он не сильно отличается от pyqt5 , в основном изменили локацию констант.  - Andy_U13.02.2022 01:39- Или на pyside6, у которого home page, если посмотреть на pypi.org, https://wiki.qt.io/Qt_for_Python, т.е. сайт нынче тот же, что и у Qt6? Раньше то, да, pyside2 отставал от PyQt6 по версиям, а вот сейчас даже не знаю, куда кидаться. 
 
 - unsignedchar12.02.2022 14:14- Начинающему было бы полезно и интересно сконструировать GUI в qt creator и подключить к нему код на Python. А не вот это вот.  - csl12.02.2022 15:59- Offtop: или было бы интересно делать Python-биндинги из OCaml. Кстати, @amarao(или ещё кто-нибудь знает), каким образом перевести на русский "OCaml value specifications" discuss.ocaml.org/t/8786/5 (хотите - в личку)? 
  - HemulGM14.02.2022 07:27+1- Начинающему было бы полезно знать, что на питоне приложения с GUI не стоит делать.  - unsignedchar14.02.2022 10:45+2- Таким образом как в статье — точно не нужно ;) 
 Хотя вы правы, хороший, годный способ изготовления GUI к приложению на python науке не известен.
 
 
 - lab41212.02.2022 15:43+2- а кто это вообще одобрил из песочницы? понятно что человек не знал что написать и написал очередную статью которых тут уже штук 8 найдётся. но зачем это было одобрять и тратить свои инвайты? зачем ставить плюсики? уровень статей и их залайканости отражает уровень читателей сообщества. раз такое читают и лайкают - значит те кто это сделал считают это нормальным уровнем. а тогда они и определяют уровень читателя, а не те три человека кто возмутился в комментариях ) добро пожаловать в новый хабр! )) 
 - Emulyator12.02.2022 20:39- вот я начинающий, запускаю cmd, ввожу: - pip3 install PyQt5 - получаю: - "pip3" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. - ))  - unsignedchar12.02.2022 21:05- Потому что при установке Python вы одну галку не поставили ;) - Или весь Python не установлен ;)  - Emulyator12.02.2022 21:46- Питонов штуки 3 стоит, похоже просто не повезло, продолжу использовать обычный Qt, он проще. ) 
 
 
 - includedlibrary13.02.2022 02:47+1- Статья ни о чём. Можно сравнить с топами интересных фактов. Вроде как познавательный контент, но толку от него нет. Смотрите, можно сделать окошко и надписи. Ценность этих знаний равносильна ценности знания скорости спермы (60 км в час). После туториала, кмк, у человека должно остаться понимание того, как с библиотекой в целом работать, остальное можно и в документации прочесть 
 
           
 

Error1024
Продавцы
гкурсов по Python/js отрицали что курсы приведут к деградации, но именно деградацию мы тут и видим.Ни объяснения, что такое Qt, что такое цикл сообщений, какой вообще жизненный цикл у оконного приложения, ничего, просто «pip install» — «скопируйте код» — «у нас получилось, круто».
В чем смысл этого туториала? Hello World, есть и на официальном сайте PyQt, внятного объяснения, того, что мы сделали, зачем, и на каких технологиях тут нет.
philosoph
Кому нужны фундаментальные знания, те пойдут в хелп библиотеки и скачают соответствующую книгу Прохорёнка и Дронова. А так, чтобы с ходу пощупать, что тут к чему, подойдёт и такое. Удивило только, что по QT совсем недавно тут же публиковалось более развёрнутое руководство. Вот, вторую часть недавно видел.
HemulGM
Ни кто ни куда не пойдет. Будут штапмовать поделки именно по таким туториалам. А "что" и "как" большинство не интересует. Ни кто не пойдёт читать книги. Посмотрят пример, посмотрят видосики, скопируют код и как только нужного кода не окажется в примерах, побегут на форумы спамить вопросами, ответы на которые есть в документации на первых же страницах. И я сейчас не только про Qt. Предлагаю вам зайти на соседний сайт qna.habr.com и убедиться в моих словах.
TsarOrgasmatron
Потому что миру нужны дешёвые программисты - рабочие лошадки, которые будут выполнять не сложную и рутинную работу.
А вообще, я по работе часто пользуюсь гуглом по пустяковым вопросам. Коллеги из обретают велосипед с нуля каждый раз, и это правильно, когда нужна точность. Но я в этом не вижу смысла и смотрю решения других, чтобы потом воспользоваться им или подправить.
HemulGM
Ну всё же есть отличие между поиском некого шаблона (а возможно, библиотеки), который ты будешь использовать и модифицировать под собственные нужды и гуглением готового решения задачи, решение которой ты не будешь даже понимать, а за внесением изменений, т.к. это не решает все твои задачи, обращаться всё к тем же форумам.
Искать готовые кускибазового функционала, если его не оказалось в основном фреймфорке или стд. либах языка - нормально. Мне тоже легче найти алгоритм сортировки, нежели его писать. Это сэкономит пару минут и огородит от ошибок невнимательности. С более же сложными вещами стоит разобраться для начала. Это как минимум полезно.