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