Привет, Хабр! Сегодня я вас хочу научить делать интерфейс на 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>')
Эпилог
Вот и всё. В следующей части я постараюсь описать кнопки, меню и события.
До новых встреч!
Комментарии (20)
DeepFakescovery
12.02.2022 12:20+1лучше писать уроки на свежем pyqt6 .
Он не сильно отличается от pyqt5 , в основном изменили локацию констант.
Andy_U
13.02.2022 01:39Или на pyside6, у которого home page, если посмотреть на pypi.org, https://wiki.qt.io/Qt_for_Python, т.е. сайт нынче тот же, что и у Qt6? Раньше то, да, pyside2 отставал от PyQt6 по версиям, а вот сейчас даже не знаю, куда кидаться.
unsignedchar
12.02.2022 14:14Начинающему было бы полезно и интересно сконструировать GUI в qt creator и подключить к нему код на Python. А не вот это вот.
csl
12.02.2022 15:59Offtop: или было бы интересно делать Python-биндинги из OCaml. Кстати, @amarao(или ещё кто-нибудь знает), каким образом перевести на русский "OCaml value specifications" discuss.ocaml.org/t/8786/5 (хотите - в личку)?
HemulGM
14.02.2022 07:27+1Начинающему было бы полезно знать, что на питоне приложения с GUI не стоит делать.
unsignedchar
14.02.2022 10:45+2Таким образом как в статье — точно не нужно ;)
Хотя вы правы, хороший, годный способ изготовления GUI к приложению на python науке не известен.
lab412
12.02.2022 15:43+2а кто это вообще одобрил из песочницы? понятно что человек не знал что написать и написал очередную статью которых тут уже штук 8 найдётся. но зачем это было одобрять и тратить свои инвайты? зачем ставить плюсики? уровень статей и их залайканости отражает уровень читателей сообщества. раз такое читают и лайкают - значит те кто это сделал считают это нормальным уровнем. а тогда они и определяют уровень читателя, а не те три человека кто возмутился в комментариях ) добро пожаловать в новый хабр! ))
Emulyator
12.02.2022 20:39вот я начинающий, запускаю cmd, ввожу:
pip3 install PyQt5
получаю:
"pip3" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.
))
unsignedchar
12.02.2022 21:05Потому что при установке Python вы одну галку не поставили ;)
Или весь Python не установлен ;)
Emulyator
12.02.2022 21:46Питонов штуки 3 стоит, похоже просто не повезло, продолжу использовать обычный Qt, он проще. )
includedlibrary
13.02.2022 02:47+1Статья ни о чём. Можно сравнить с топами интересных фактов. Вроде как познавательный контент, но толку от него нет. Смотрите, можно сделать окошко и надписи. Ценность этих знаний равносильна ценности знания скорости спермы (60 км в час). После туториала, кмк, у человека должно остаться понимание того, как с библиотекой в целом работать, остальное можно и в документации прочесть
Error1024
Продавцы
гкурсов по Python/js отрицали что курсы приведут к деградации, но именно деградацию мы тут и видим.Ни объяснения, что такое Qt, что такое цикл сообщений, какой вообще жизненный цикл у оконного приложения, ничего, просто «pip install» — «скопируйте код» — «у нас получилось, круто».
В чем смысл этого туториала? Hello World, есть и на официальном сайте PyQt, внятного объяснения, того, что мы сделали, зачем, и на каких технологиях тут нет.
philosoph
Кому нужны фундаментальные знания, те пойдут в хелп библиотеки и скачают соответствующую книгу Прохорёнка и Дронова. А так, чтобы с ходу пощупать, что тут к чему, подойдёт и такое. Удивило только, что по QT совсем недавно тут же публиковалось более развёрнутое руководство. Вот, вторую часть недавно видел.
HemulGM
Ни кто ни куда не пойдет. Будут штапмовать поделки именно по таким туториалам. А "что" и "как" большинство не интересует. Ни кто не пойдёт читать книги. Посмотрят пример, посмотрят видосики, скопируют код и как только нужного кода не окажется в примерах, побегут на форумы спамить вопросами, ответы на которые есть в документации на первых же страницах. И я сейчас не только про Qt. Предлагаю вам зайти на соседний сайт qna.habr.com и убедиться в моих словах.
TsarOrgasmatron
Потому что миру нужны дешёвые программисты - рабочие лошадки, которые будут выполнять не сложную и рутинную работу.
А вообще, я по работе часто пользуюсь гуглом по пустяковым вопросам. Коллеги из обретают велосипед с нуля каждый раз, и это правильно, когда нужна точность. Но я в этом не вижу смысла и смотрю решения других, чтобы потом воспользоваться им или подправить.
HemulGM
Ну всё же есть отличие между поиском некого шаблона (а возможно, библиотеки), который ты будешь использовать и модифицировать под собственные нужды и гуглением готового решения задачи, решение которой ты не будешь даже понимать, а за внесением изменений, т.к. это не решает все твои задачи, обращаться всё к тем же форумам.
Искать готовые кускибазового функционала, если его не оказалось в основном фреймфорке или стд. либах языка - нормально. Мне тоже легче найти алгоритм сортировки, нежели его писать. Это сэкономит пару минут и огородит от ошибок невнимательности. С более же сложными вещами стоит разобраться для начала. Это как минимум полезно.