Первые программы на PyQt5 [Урок 2]

Что такое pyqt5?

PyQt — это библиотека, которая позволяет использовать фреймворк Qt GUI (GUI — это графический интерфейс пользователя) в Python. Сам Qt, как известно, написан на C . Используя его в Python, вы можете создавать приложения намного быстрее, не жертвуя при этом значительной частью производительности C .

PyQt5 это самая последняя, пятая версия Qt. Еще можно найти в интернете случайное упоминание PyQt4, но эта версия устарела и больше не поддерживается.

Новый интересный конкурент PyQt — это Qt for Python. Она обладает практически идентичным API, но в отличие от PyQt имеет лицензию LGPL и, следовательно, может использоваться бесплатно даже в коммерческих проектах. Она поддерживается компанией Qt, а значит, скорее всего, за ней будущее.

Qcolordialog

QColorDialog – виджет диалога для выбора цветовых значений.

#!/usr/bin/python3# -*- coding: utf-8 -*-importsysfromPyQt5.QtWidgetsimport(QWidget,QPushButton,QFrame,QColorDialog,QApplication)fromPyQt5.QtGuiimportQColorclassExample(QWidget):def__init__(self):super().__init__()self.initUI()definitUI(self):col=QColor(0,0,0)self.btn=QPushButton('Dialog',self)self.btn.move(20,20)self.btn.clicked.connect(self.showDialog)self.frm=QFrame(self)self.frm.setStyleSheet("QWidget { background-color: %s }"%col.name())self.frm.setGeometry(130,22,100,100)self.setGeometry(300,300,250,180)self.setWindowTitle('Color dialog')self.show()defshowDialog(self):col=QColorDialog.getColor()ifcol.isValid():self.frm.setStyleSheet("QWidget { background-color: %s }"%col.name())if__name__=='__main__':app=QApplication(sys.argv)ex=Example()sys.exit(app.exec_())

Пример приложения показывает кнопку и QFrame. Фон виджета устанавливается чёрным. Используя QColorDialog, мы можем менять фон.

col=QColor(0,0,0)

Это первоначальный цвет фона QtGui.QFrame.

col=QColorDialog.getColor()

Это строка высветит QColorDialog.

ifcol.isValid():self.frm.setStyleSheet("QWidget { background-color: %s }"%col.name())

Мы проверяем, является ли цвет валидным. Если мы нажимаем кнопку «Cancel», возвращается невалидный цвет. Если цвет валиден, мы меняем цвет фона, используя таблицы стилей (CSS).

Похожее:  Дневник ру: онлайн регистрация

Qfiledialog

QFileDialog – это диалог, который позволяет пользователям выбирать файлы или папки. Файлы могут быть выбраны и для открытия, и для сохранения.

#!/usr/bin/python3# -*- coding: utf-8 -*-importsysfromPyQt5.QtWidgetsimport(QMainWindow,QTextEdit,QAction,QFileDialog,QApplication)fromPyQt5.QtGuiimportQIconclassExample(QMainWindow):def__init__(self):super().__init__()self.initUI()definitUI(self):self.textEdit=QTextEdit()self.setCentralWidget(self.textEdit)self.statusBar()openFile=QAction(QIcon('open.png'),'Open',self)openFile.setShortcut('Ctrl O')openFile.setStatusTip('Open new File')openFile.triggered.connect(self.showDialog)menubar=self.menuBar()fileMenu=menubar.addMenu('&File')fileMenu.addAction(openFile)self.setGeometry(300,300,350,300)self.setWindowTitle('File dialog')self.show()defshowDialog(self):fname=QFileDialog.getOpenFileName(self,'Open file','/home')[0]f=open(fname,'r')withf:data=f.read()self.textEdit.setText(data)if__name__=='__main__':app=QApplication(sys.argv)ex=Example()sys.exit(app.exec_())

Пример показывает строку меню, виджет редактирования текста и строку состояния. Пункт меню показывает QtGui.QFileDialog, который используется для выбора файла. Содержимое файла загружается в виджет редактирования текста.

fname=QFileDialog.getOpenFileName(self,'Open file','/home')[0]

Мы показываем QFileDialog. Первая строка в методе getOpenFileName() – это заголовок. Вторая строка указывает на показываемую директорию. По умолчанию, файловый фильтр установлен в положение «Все файлы (*)».

f=open(fname,'r')withf:data=f.read()self.textEdit.setText(data)

Выбранный файл читается и содержимое файла записывается в виджет редактирования текста.

В этой части руководства PyQt5, мы работали с диалогами.

Qfontdialog

QFontDialog – это виджет диалога для выбора шрифта.

#!/usr/bin/python3# -*- coding: utf-8 -*-importsysfromPyQt5.QtWidgetsimport(QWidget,QVBoxLayout,QPushButton,QSizePolicy,QLabel,QFontDialog,QApplication)classExample(QWidget):def__init__(self):super().__init__()self.initUI()definitUI(self):vbox=QVBoxLayout()btn=QPushButton('Dialog',self)btn.setSizePolicy(QSizePolicy.Fixed,QSizePolicy.Fixed)btn.move(20,20)vbox.addWidget(btn)btn.clicked.connect(self.showDialog)self.lbl=QLabel('Knowledge only matters',self)self.lbl.move(130,20)vbox.addWidget(self.lbl)self.setLayout(vbox)self.setGeometry(300,300,250,180)self.setWindowTitle('Font dialog')self.show()defshowDialog(self):font,ok=QFontDialog.getFont()ifok:self.lbl.setFont(font)if__name__=='__main__':app=QApplication(sys.argv)ex=Example()sys.exit(app.exec_())

В нашем примере, мы имеем кнопку и метку. С помощью QFontDialog, мы меняем шрифт метки.

Qinputdialog

QInputDialog – простой удобный диалог для получения единственного значения от пользователя. Введённое значение может быть строкой, числом или пунктом из списка.

#!/usr/bin/python3# -*- coding: utf-8 -*-importsysfromPyQt5.QtWidgetsimport(QWidget,QPushButton,QLineEdit,QInputDialog,QApplication)classExample(QWidget):def__init__(self):super().__init__()self.initUI()definitUI(self):self.btn=QPushButton('Dialog',self)self.btn.move(20,20)self.btn.clicked.connect(self.showDialog)self.le=QLineEdit(self)self.le.move(130,22)self.setGeometry(300,300,290,150)self.setWindowTitle('Input dialog')self.show()defshowDialog(self):text,ok=QInputDialog.getText(self,'Input Dialog','Enter your name:')ifok:self.le.setText(str(text))if__name__=='__main__':app=QApplication(sys.argv)ex=Example()sys.exit(app.exec_())

Пример имеет кнопку и виджет редактирования строки. Кнопка показывает диалог ввода. Вводимый текст может быть отображён в виджете редактирования строки.

text,ok=QInputDialog.getText(self,'Input Dialog','Enter your name:')

Эта строка показывает диалог ввода. Первая строка – это заголовок диалога, вторая – сообщение внутри диалога. Диалог возвращает введённый текст и логическое значение. Если мы нажимаем кнопку «ОК», то логическое значение является правдой.

ifok:self.le.setText(str(text))

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

Бонус: создаем установщик

Библиотека fbs также позволяет вам создать установщик для вашего приложения с помощью команды fbs installer:

(Если вы работаете в Windows, вам сначала нужно установить NSIS и поместить путь к нему в свой PATH.)

За дополнительной информацией по использованию библиотеки fbs обратитесь к ее документации.

Виджеты

Все, что вы видите в приложениях PyQt, называется виджетами. Кнопки, сообщения, окна, диалоговые окна, индикаторы выполнения и так далее — все это виджеты. Подобно html элементам, виджеты в Qt зачастую вложены друг в друга. Например, окно может содержать кнопку, а кнопка, в свою очередь, — сообщение.

На следующей картинке показаны наиболее распространенные виджеты Qt:

Они перечислены ниже в порядке сверху вниз и слева направо:

Отсюда вы можете загрузить, если хотите, код приложения, которое создает такое окно.

Визуальный редактор слота/сигнала

Мы видели, как подключать сигнал виджета к слоту при помощи метода connect(), но это не единственный способ.

На самом деле, для каждого виджета есть предопределенные слоты. Вы можете связать сигнал с любым предопределенным слотом, без необходимости кодить в дизайнере PyQt5.

Перетяните QPushButton и QLineEdit в вашу форму.

Нажмите F4 и перетяните курсор из QPushButton и отпустите его в верхней части QLineEdit. Чтобы вернуться в обычный режим, нажмите на F3.

Благодаря этому появится редактор сигнала/слота.

Слева находятся предопределенные сигналы, справа — предопределенные слоты. Скажем, нам нужно подключить сигнал clicked() с слотом «очистки содержимого«.

Выберите сигнал clicked слева и выберите clear слот справа и нажмите OK.

После выполнения подключений ваших сигналов и слотов, вы можете выйти из этого режима, нажав ESC, или F3.

Сейчас, если вы запустите эту форму, и нажмете QPushButton, то любой текст в QLineEdit будет очищен. Вы можете редактировать или удалять эти связи в панели редактора сигналов и слотов.

Сохраните форму как signaledit.ui и конвертируем её в signaledit.py:

Полученный файл импортируем в наш код:

Результат:

Встроенные стили

Самый грубый способ изменить внешний вид вашего приложения — установить глобальный стиль. Вспомните изображение виджетов, которое мы уже приводили выше:

Здесь используется стиль под названием Fusion. Если вместо этого использовать стиль Windows, это будет выглядеть следующим образом:

Чтобы применить стиль, нужно использовать метод app.setStyle (…):

from PyQt5.QtWidgets import *
app = QApplication([])
app.setStyle('Fusion')
...

Доступные стили зависят от вашей платформы, но обычно они включают в себя «Fusion», «Windows», «WindowsVista» (только для Windows) и «Macintosh» (только для Mac).

Выбор одного элемента из qcombobox

Чтобы выбрать элемент из QComboBox, у вас есть два метода:

Обратите внимание на то, что при выборе элемента по тексту, следует убедиться в том, что вы вводите правильный текст. В противном случае, QComboBox останется на первом элементе.

Если вы хотите просмотреть вашу базу данных в формате таблицы, в PyQt5 предоставляется QTableWidget как раз для этой цели.

QTableWidget состоит из клеток, каждая клетка — экземпляр класса QTableWidgetItem.

Давайте создадим форму, которая содержит QTableWidget и QPushButton.

Перетяните QTableWidget и QPushButton из PyQt5 Designer. После этого, сохраните форму как qtable.ui и конвертируйте дизайн в qtable.py.

Чтобы добавлять ряды в QTableWidget, вы можете использовать метод setRowCount().

Для внесения столбцов в QTableWidget, воспользуйтесь методом setColumnCount().

Теперь вы можете писать текст вручную внутри клеток QTableWidget.

Загрузка .ui против конвертации .ui в .py

В данном руководстве мы используем PyQt5 Designer, но перед тем, как мы пойдем дальше, давайте рассмотрим, как еще мы можем использовать сгенерированный файл из PyQt5 Designer.

Нам нужно открыть PyQt5 Designer, выбрать шаблон Main Window и нажать кнопку create.

Далее в файловом меню (File), нажимаем сохранить. PyQt5 Designer экспортирует вашу форму в XML с расширением .ui.

Для использования этого дизайна, у вас есть два способа:

  • Загрузить файл .ui в ваш код Python;
  • Конвертировать файл .ui в файл .py при помощи pyuic5;

Загрузка .ui файла в ваш код python

Чтобы загрузить файл .ui в ваш код Python, вы можете использовать функцию loadUI() из uic вот так:

Если вы запустите код, вы увидите окно, в котором есть только ярлык.

Это значит, что ui файл успешно загрузился!

Мы используем sys.exit(app.exec()) вместо использования app.exec() напрямую, чтобы выслать правильный код статуса, родительский процесс, или процесс вызова.

Если вы использовали app.exec() напрямую, приложение отправит ноль, что говорит об успехе, и это произойдет даже если приложение упадет.

Закрытие окна

Очевидный способ закрыть окно, это нажать на крестик. В следующем примере мы покажем, как мы можем программно закрыть наше окно. Мы кратко рассмотрим сигналы и слоты.

#!/usr/bin/python3# -*- coding: utf-8 -*-importsysfromPyQt5.QtWidgetsimportQWidget,QPushButton,QApplicationfromPyQt5.QtCoreimportQCoreApplicationclassExample(QWidget):def__init__(self):super().__init__()self.initUI()definitUI(self):qbtn=QPushButton('Quit',self)qbtn.clicked.connect(QCoreApplication.instance().quit)qbtn.resize(qbtn.sizeHint())qbtn.move(50,50)self.setGeometry(300,300,250,150)self.setWindowTitle('Quit button')self.show()if__name__=='__main__':app=QApplication(sys.argv)ex=Example()sys.exit(app.exec_())

В этом примере, мы создаем кнопку выхода. После нажатия на кнопку, приложение завершается.

qbtn=QPushButton('Quit',self)

Мы создаем кнопку. Кнопка является экземпляром класса QPushButton. Первый параметр конструктора – название кнопки. Вторым параметром является родительский виджет. Родительский виджет является виджетом Example, который наследуется от QWidget.

qbtn.clicked.connect(QCoreApplication.instance().quit)

Система обработки событий в PyQt5 построена на механизме сигналов и слотов. Если мы нажмем на кнопку, вызовется сигнал “нажатие”. Слот может быть слот Qt или любая Python функция.

QCoreApplication содержит главный цикл обработки; он обрабатывает и диспетчеризирует все события. Метод instance() дает нам его текущий экземпляр.

Обратите внимание, что QCoreApplication создается с QApplication. Сигнал “нажатие” подключен к методу quit(), который завершает приложение. Коммуникация осуществляется между двумя объектами: отправителя и приемника. Отправитель кнопка, приемник – объект приложения.

Как выпускать сигналы в pyqt5

Мы увидели, как работают сигналы и слоты. Все сигналы, с которыми мы работали, являются предопределенными для нас.

Но что на счет выпуска собственного сигнала?

Это очень просто! Вы можете сделать это, просто использовав класс pyqtSignal, как показано ниже:

  • Определите ваше событие типом pyqtSignal;
  • Вызовите метод emit() в том месте, где вы хотите, чтобы произошло событие.

Скажем, у нас есть классnut, и мы хотим, чтобы сигнал cracked был выпущен.

Компилируем наше приложение

Теперь у вас есть базовые знания для создания GUI, который реагирует на ввод пользователя. Допустим, вы написали приложение. Оно работает на вашем компьютере. Как передать его другим людям, чтобы они тоже могли его запустить?

Вы можете попросить пользователей вашего приложения установить Python и PyQt, как мы сделали выше, а затем предоставить им свой исходный код. Но это очень утомительно (и обычно непрактично). Вместо этого нам нужен отдельный вариант вашего приложения.

В мире Python процесс превращения исходного кода в автономный исполняемый файл называется замораживанием (freezing). Несмотря на наличие множества библиотек, решающих эту проблему, например PyInstaller, py2exe, cx_Freeze, bbfreze, py2app и так далее, замораживание приложений PyQt всегда было на удивление непростой проблемой.

Мы будем использовать новую библиотеку под названием fbs, которая позволяет создавать автономные исполняемые файлы для приложений PyQt. Для ее установки введите команду:

pip install fbs

Затем выполним следующую команду:

fbs startproject

Вам будет предложено ввести несколько значений:

Когда вы введете предложенную команду run, должно открыться пустое окно:

Это приложение PyQt5, такое же, как и те, что мы видели раньше. Его исходный код находится в src/main/python/main.py в вашем текущем каталоге. Но вот что самое интересное: мы можем использовать fbs, чтобы превратить его в отдельный исполняемый файл!

fbs freeze

Эта команда создает и помещает автономный двоичный файл в папку /MyApp/ вашего текущего каталога. Вы можете отправить его своим друзьям (с той же ОС, что и ваша), и они также смогут запустить ваше приложение!

Меняем текст в qlabel

Чтобы изменить текст в QLabel, вы можете использовать метод setText(), вот так:

Именно на столько все просто! Давайте рассмотрим другие виджеты.

Виджет QLineEdit – это редактируемое поле, где вы можете принимать данные от пользователя. LineEdit содержит множество методов, с которыми можно работать.

Я создам новый дизайн qline.ui, используя дизайнер PyQt5 и внесу шесть виджетов QLineEdit и экспортирую его в файл qline.py.

Cодержимое файла qline.py после конвертации:

Давайте познакомимся с методами QLineEdit:

Результат:

Очистка содержимого qtablewidget

Чтобы очистить содержимое QTableWidget, вы можете использовать метод clear, вот так:

Чтобы заполнить QtableWidget программно, вам нужно использовать метод setItem() для каждого объекта QtableWidgetItem.

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

Чтобы сделать QTableWidget нередактируемым, вы можете использовать метод setFlags(), чтобы сделать каждый QTableWidgetItem доступным только для чтения.

Вам нужно установить флажки, перед тем как настраивать содержимое вашей клетки.

Таким образом, ваш код будет выглядеть вот так:

Теперь, если вы попробуете отредактировать какую-либо клетку — у вас не выйдет, так как QtableWidgetItem теперь нельзя редактировать

До этого момента, названия столбцов QTableWidget были числами. Как на счет того, чтобы поменять названия столбцов на что-нибудь другое?

Чтобы задать текст заголовкам QTableWidget, вы можете использовать метод setHorizontalHeaderLabels(), вот так:

Таким же образом, вы можете менять заголовок ряда, при помощи метода setVerticalHeaderLabels():

Вы можете сделать ваш QTableWidget сортируемым, при помощи метода setSortingEnabled().

Теперь, если пользователь нажмет на любой заголовок столбца, он может сортировать данные в порядке убывания, или возрастания.

Вы можете использовать этот метод перед, или до наполнения QTableWidget данными.

Что на счет сортировки в QTableWidget, но только для определенного столбца?

Вы можете использовать метод sortByColumn(), и указать индекс столбца и порядок сортировки, вот так:

Кстати, вы можете использовать метод sortItems() для сортировки QTableWidget в возрастающем порядке по умолчанию.

Или вы можете определить свой порядок сортировки:

Помните, что если вы хотите сортировать ваши столбцы программно, вам нужно использовать методы сортировки после заполнения QTableWidget данными, иначе они не будут в нужном вам порядке.

У вас может появится задача, чтобы пользователь выбирал значение внутри QTableWidget, вместо ввода текста.Как на счет того, чтобы добавить QComboBox в QTableWidgetItem?

Чтобы добавить QComboBox внутрь QTableWidgetItem, вы можете использовать метод setCellWidget():

Отлично!

Не ограничивайте себя в воображении и попробуйте вставлять различные виджеты, такие как QСheckbox, или даже QProgressBar.

Указанный выше код будет таким же, за исключением строки, где вы создаете QСomboBox, здесь вы внесете тот виджет, который вам нужен.

Единственное ограничение — это ваше собственное воображение!

Подсказки

Мы можем предоставить всплывающую подсказку для любого из виджетов.

#!/usr/bin/python3# -*- coding: utf-8 -*-importsysfromPyQt5.QtWidgetsimport(QWidget,QToolTip,QPushButton,QApplication)fromPyQt5.QtGuiimportQFontclassExample(QWidget):def__init__(self):super().__init__()self.initUI()definitUI(self):QToolTip.setFont(QFont('SansSerif',10))self.setToolTip('This is a <b>QWidget</b> widget')btn=QPushButton('Button',self)btn.setToolTip('This is a <b>QPushButton</b> widget')btn.resize(btn.sizeHint())btn.move(50,50)self.setGeometry(300,300,300,200)self.setWindowTitle('Tooltips')self.show()if__name__=='__main__':app=QApplication(sys.argv)ex=Example()sys.exit(app.exec_())

В этом примере мы покажем подсказку для двух виджетов PyQt5.

QToolTip.setFont(QFont('SansSerif',10))

Этот статический метод устанавливает шрифт, используемый для отображения подсказки. Мы используем шрифт 10px SansSerif.

self.setToolTip('This is a <b>QWidget</b> widget')

Чтобы создать всплывающую подсказку, мы вызываем метод setToolTip(). Мы можем использовать форматирование текста.

btn=QPushButton('Button',self)btn.setToolTip('This is a <b>QPushButton</b> widget')

Мы создаем виджет кнопки и устанавливаем подсказку для него.

btn.resize(btn.sizeHint())btn.move(50,50)

Меняем размер кнопки и перемещаем относительно окна. Метод sizeHint() дает рекомендуемый размер для кнопки.

Пользовательские цвета

Если вам нравится стиль, но вы хотите изменить его цвета (например, на темную тему), вы можете использовать QPalette и app.setPalette (…). Например:

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QApplication, QPushButton

app = QApplication([])
app.setStyle('Fusion')
palette = QPalette()
palette.setColor(QPalette.ButtonText, Qt.red)
app.setPalette(palette)
button = QPushButton('Hello World')
button.show()
app.exec_() 

Это изменит цвет текста в кнопках на красный:

Как создать темную тему стиля Fusion, можно посмотреть вот здесь.

Простой пример

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

PyQt5 является инструментом высокого уровня. Если бы мы писали это на более низком уровне, следующий пример кода легко мог бы растянуться на сотни строк:

#!/usr/bin/python3# -*- coding: utf-8 -*-importsysfromPyQt5.QtWidgetsimportQApplication,QWidgetif__name__=='__main__':app=QApplication(sys.argv)w=QWidget()w.resize(250,150)w.move(300,300)w.setWindowTitle('Simple')w.show()sys.exit(app.exec_())

Приведенный выше код показывает небольшое окно на экране.

importsysfromPyQt5.QtWidgetsimportQApplication,QWidget

Здесь мы делаем необходимые импорты. Основные виджеты расположены в PyQt5.QtWidgets.

app=QApplication(sys.argv)

Каждое приложение PyQt5 должно создать объект приложения (экземпляр QApplication). Параметр sys.argv это список аргументов командной строки. Скрипты Python можно запускать из командной строки. Это способ, которым мы можем контролировать запуск наших сценариев.

w=QWidget()

Виджет QWidget это базовый класс для всех объектов интерфейса пользователя в PyQt5. Мы предоставляем конструктор по умолчанию для QWidget. Конструктор по умолчанию не имеет родителя. Виджет без родителей называется окно.

w.resize(250,150)

Метод resize() изменяет размеры виджета. Он стал 250 пикселей в ширину и 150 в высоту.

w.move(300,300)

Метод move() двигает виджет на экране на координату x=300, y=300.

w.setWindowTitle('Simple')

Здесь мы задаём заголовок нашего окна.

w.show()

Метод show() отображает виджет на экране. Виджет сначала создаётся в памяти, и только потом (с помощью метода show) показывается на экране.

sys.exit(app.exec_())

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

Метод exec_ () имеет подчеркивание. Это происходит потому, что exec является ключевым словом в python 2.

Таблицы стилей

В дополнение к вышесказанному вы можете изменить внешний вид своего приложения с помощью таблиц стилей. Это аналог CSS в Qt. Например, мы можем добавить некоторое пространство:

from PyQt5.QtWidgets import QApplication, QPushButton

app = QApplication([])
app.setStyleSheet("QPushButton { margin: 10ex; }")
button = QPushButton('Hello World')
button.show()
app.exec_() 

Для получения дополнительной информации о таблицах стилей смотрите документацию Qt.

Установка pyqt

Лучший способ управлять зависимостями в Python — через виртуальную среду. Виртуальная среда — это просто локальный каталог, содержащий библиотеки для данного конкретного проекта. В отличии от общесистемной установки библиотек, это не не повлияет на другие ваши проекты.

Для создания виртуальной среды в текущем каталоге выполните следующую команду:

python3 -m venv venv

Эта команда создаст директорию venv/. Чтобы активировать виртуальную среду в Windows, выполните следующую команду:

call venv/scripts/activate.bat

А для Mac и Linux вот эту:

source venv/bin/activate

То, что виртуальная среда активирована, вы можете увидеть по префиксу (venv) в командной строке:

Теперь, чтобы установить PyQt, выполните следующую команду:

pip install PyQt5==5.9.2

Мы используем версию 5.9.2, потому что не все версии PyQt одинаково стабильны. Данная версия гарантированно будет работать хорошо.

Итак, поздравляем! Вы только что успешно установили PyQt5.

Установка pyqt5 из исходников на windows

Скачивайте и распакуйте архив с сайта которого мы указали выше.

Так как SIP требует компилятор GCC, вам нужно установить MinGW, который является портом Windows для компилятора Linux, GCC.

Единственное, что нужно поменять — это момент конфигурации. Вам нужно сообщить Python о платформе.

Это можно выполнить следующим образом:

Поздравляем! Вы успешно установили PyQt5 из исходника.

Центрирование окна на экране

Следующий скрипт показывает, как мы можем центрировать окно на рабочем столе.

#!/usr/bin/python3# -*- coding: utf-8 -*-importsysfromPyQt5.QtWidgetsimportQWidget,QDesktopWidget,QApplicationclassExample(QWidget):def__init__(self):super().__init__()self.initUI()definitUI(self):self.resize(250,150)self.center()self.setWindowTitle('Center')self.show()defcenter(self):qr=self.frameGeometry()cp=QDesktopWidget().availableGeometry().center()qr.moveCenter(cp)self.move(qr.topLeft())if__name__=='__main__':app=QApplication(sys.argv)ex=Example()sys.exit(app.exec_())

Класс QtWidgets.QDesktopWidget предоставляет информацию о компьютере пользователя, в том числе о размерах экрана.

self.center()

Код, который будет центрировать окно, находится в нами созданном методе center().

qr=self.frameGeometry()

Мы получаем прямоугольник, определяющий геометрию главного окна. Это включает в себя любые рамки окна.

cp=QDesktopWidget().availableGeometry().center()

Мы получаем разрешение экрана нашего монитора. И с этим разрешением, мы получаем центральную точку.

qr.moveCenter(cp)

Наш прямоугольник уже имеет ширину и высоту. Теперь мы установили центр прямоугольника в центре экрана. Размер прямоугольника не изменяется.

self.move(qr.topLeft())

Мы двигаем верхний левый угол окна приложения в верхний левый угол прямоугольника qr, таким образом, центрируя окно на нашем экране.

В этой части урока PyQt5 мы рассмотрели некоторые основы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *