Привет, Хабр! Сегодня я вас хочу научить делать интерфейс на 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_())
Когда вы запустите, должна получится примерно такая картина:

Меняем шрифт надписи
А теперь поменяем шрифт надписи. Теперь код станет таким:
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>')
Эпилог
Вот и всё. В следующей части я постараюсь описать кнопки, меню и события.
До новых встреч!