Привет, Хабр! Сегодня я вас хочу научить делать интерфейс на Python 3&PyQt5.

Установка PyQt5

Для того, чтобы установить PyQt5 в Windows или MacOS, откройте Командную строку или Терминал и введите:

pip3 install PyQt5

Для Linux, откройте Терминал и введите:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python3-pyqt5

Hello, 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_())

Когда вы запустите, должна получится примерно такая картина:

Окно Hello, world на Ubuntu
Окно Hello, world на Ubuntu

Меняем шрифт надписи

А теперь поменяем шрифт надписи. Теперь код станет таким:

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)


  1. Error1024
    12.02.2022 07:03
    +18

    Продавцы гкурсов по Python/js отрицали что курсы приведут к деградации, но именно деградацию мы тут и видим.
    Ни объяснения, что такое Qt, что такое цикл сообщений, какой вообще жизненный цикл у оконного приложения, ничего, просто «pip install» — «скопируйте код» — «у нас получилось, круто».
    В чем смысл этого туториала? Hello World, есть и на официальном сайте PyQt, внятного объяснения, того, что мы сделали, зачем, и на каких технологиях тут нет.


    1. philosoph
      12.02.2022 08:02
      -11

      Кому нужны фундаментальные знания, те пойдут в хелп библиотеки и скачают соответствующую книгу Прохорёнка и Дронова. А так, чтобы с ходу пощупать, что тут к чему, подойдёт и такое. Удивило только, что по QT совсем недавно тут же публиковалось более развёрнутое руководство. Вот, вторую часть недавно видел.


      1. HemulGM
        12.02.2022 12:17
        +9

        Ни кто ни куда не пойдет. Будут штапмовать поделки именно по таким туториалам. А "что" и "как" большинство не интересует. Ни кто не пойдёт читать книги. Посмотрят пример, посмотрят видосики, скопируют код и как только нужного кода не окажется в примерах, побегут на форумы спамить вопросами, ответы на которые есть в документации на первых же страницах. И я сейчас не только про Qt. Предлагаю вам зайти на соседний сайт qna.habr.com и убедиться в моих словах.


        1. TsarOrgasmatron
          12.02.2022 13:48

          Потому что миру нужны дешёвые программисты - рабочие лошадки, которые будут выполнять не сложную и рутинную работу.

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


          1. HemulGM
            12.02.2022 13:57

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

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


  1. Closius
    12.02.2022 10:37
    -4

    зачем юзать pyqt5 если есть pyside2?


  1. DeepFakescovery
    12.02.2022 12:20
    +1

    лучше писать уроки на свежем pyqt6 .

    Он не сильно отличается от pyqt5 , в основном изменили локацию констант.


    1. unsignedchar
      12.02.2022 14:07
      +1

      КМК на таком уровне - всё равно, что qt4, что qt6.


    1. Andy_U
      13.02.2022 01:39

      Или на pyside6, у которого home page, если посмотреть на pypi.org, https://wiki.qt.io/Qt_for_Python, т.е. сайт нынче тот же, что и у Qt6? Раньше то, да, pyside2 отставал от PyQt6 по версиям, а вот сейчас даже не знаю, куда кидаться.


  1. unsignedchar
    12.02.2022 14:14

    Начинающему было бы полезно и интересно сконструировать GUI в qt creator и подключить к нему код на Python. А не вот это вот.


    1. csl
      12.02.2022 15:59

      Offtop: или было бы интересно делать Python-биндинги из OCaml. Кстати, @amarao(или ещё кто-нибудь знает), каким образом перевести на русский "OCaml value specifications" discuss.ocaml.org/t/8786/5 (хотите - в личку)?


    1. HemulGM
      14.02.2022 07:27
      +1

      Начинающему было бы полезно знать, что на питоне приложения с GUI не стоит делать.


      1. unsignedchar
        14.02.2022 10:45
        +2

        Таким образом как в статье — точно не нужно ;)
        Хотя вы правы, хороший, годный способ изготовления GUI к приложению на python науке не известен.


  1. lab412
    12.02.2022 15:43
    +2

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


  1. Emulyator
    12.02.2022 20:39

    вот я начинающий, запускаю cmd, ввожу:

    pip3 install PyQt5

    получаю:

    "pip3" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

    ))


    1. unsignedchar
      12.02.2022 21:05

      Потому что при установке Python вы одну галку не поставили ;)

      Или весь Python не установлен ;)


      1. Emulyator
        12.02.2022 21:46

        Питонов штуки 3 стоит, похоже просто не повезло, продолжу использовать обычный Qt, он проще. )


        1. unsignedchar
          12.02.2022 22:14
          +1

          Питонов штуки 3 стоит

          %PATH%


    1. Hait
      12.02.2022 23:13
      +1

      `python3 -m pip install PyQt5`

      Это может помочь


  1. includedlibrary
    13.02.2022 02:47
    +1

    Статья ни о чём. Можно сравнить с топами интересных фактов. Вроде как познавательный контент, но толку от него нет. Смотрите, можно сделать окошко и надписи. Ценность этих знаний равносильна ценности знания скорости спермы (60 км в час). После туториала, кмк, у человека должно остаться понимание того, как с библиотекой в целом работать, остальное можно и в документации прочесть