PyQt4 — Введение
PyQt4 это тулкит для разработки GUI приложений. Он представляет из себя смесь языка программирование Пайтон (Питон) и библиотеки Qt. Qt – одна из наиболее мощных библиотек на этой планете. Если не самая мощная. Официальный сайт PyQt www.riverbankcomputing.co.uk разработан Филом Томпсоном.
PyQt4 представляет из себя набор модулей Пайтон. Она содержит более 300 классов и почти 6000 функций и методов. Это мультиплатформенный тулкит. Он работает на всех основных операционных системах, включая Unix, Windows и MacOS.
Начиная с версии PyQt4 GPL доступна для всех поддерживаемых платформ.
Так как тулкит содержит большое количество классов, они распределены в несколько модулей.
Модуль QtCore содержит ядро не-gui функциональности. Этот модуль используется для работы со временем, файлами и папками, различными типами даных, потоками, адресами URL, mime типами, потоками процессов. Модуль QtGui содержит графические компоненты и связанные классы. Сюда включены, например, кнопки, окна, строки состояния, панели инструментов, полосы прокрутки, изображения (bitmap), цвета, шрифты и др. Модуль QtNetwork содержит классы для сетевого программирования. Эти классы позволяют писать TCP/IP и UDP клиенты и серверы. Они делают сетевое программирование легче и более доступным. Модуль QtXml содержит классы для работы с xml файлами. Он предоставляет реализации API SAX и DOM. Модуль QtSvg предоставляет классы для отображения содержимого SVG файлов. Масштабируемая векторная графика (SVG) – это язык описания двумерной графики и графических приложений на языке XML. Модуль QtOpenGL используется для построения 3D и 2D графики с помощью библиотеки OpenGL. Модуль дает возможность бесшовной интеграции библиотек QtGui и OpenGL. Модуль QtSql содержит классы для работы с базами данных.
Простой пример
Код данного примера очень краток. Он лишь отображает небольшое окошко. Однако мы сможем сделать с ним многое. Мы сможем изменить его размеры. Распахнуть на весь экран. Минимизировать. Это требует достаточно большого кода. Кто-то уже написал эту функциональность. Потому что она повторяется в большинстве приложений, нет необходимости писать этот код опять. Таким образом это скрыто от программиста. PyQt высокоуровневый тулкит. Если бы мы писали для низкоуровневого тулкита, то следующий пример был бы намного больше.
#!/usr/bin/python
# simple.py
import sys
from PyQt4 import QtGui
widget = QtGui.QWidget()
widget.resize(250, 150)
widget.setWindowTitle(‘simple’)
widget.show()
import sys
from PyQt4 import QtGui
Подключаем необходимые модули. Основные GUI виджеты находятся в библиотеке QtGui.
app = QtGui.QApplication(sys.argv)
Каждое приложение PyQt4 должно создать объект Qapplication. Этот объект находится в модуле QtGui. Параметр sys.argv это список аргументов командной строки. Скрипты на Пайтон могут быть запущены из консоли, и с помощью аргументов мы можем контролировать запуск приложения.
widget = QtGui.QWidget()
Qwidget это базовый класс для всех объектов интерфейса пользователя для PyQt4. Мы используем стандартный конструктор для Qwidget, который не имеет родителя. Виджет у которого нет родительского является окном.
widget.resize(250, 150)
Метод resize() изменяет размеры виджета. В данном случае 250 пикселей по ширине и 150 по высоте.
widget.setWindowTitle(‘simple’)
Здесь мы устанавлиаем заголовок окна на simple.
widget.show()
Метод show() отображает окно на экране.
sys.exit(app.exec())
В конце мы запускаем основной цикл приложения. Отсюда начинается обработка событий. Приложение получает события от оконной системы и распределяет их по виджетам. Когда цикл заканчивается, и если мы вызовем метод exit(), то наше окно (главный виджет) будет уничтожено. Метод sys.exit() гарантирует чистый выход. Окружение будет проинформировано о том, как приложение завершилось.
Вы удивлены почему метод exec_() записан с подчеркиваение? Это сделано потому, что exec – ключевое слово в пайтон.
Иконка приложения
Иконка программы это просто маленькое изображение, которое обычно отображаетяс в левом верхнем углу заголовка. В следующем примере мы покажем как сделать это на PyQt4. Мы также представим некоторые новые методы.
#!/usr/bin/python
# icon.py
import sys
from PyQt4 import QtGui
class Icon(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle(‘Icon’)
self.setWindowIcon(QtGui.QIcon(‘icons/web.png’))
app = QtGui.QApplication(sys.argv)
icon = Icon()
icon.show()
sys.exit(app.exec_())
В предыдущем примере код был процедурным. Пайтон поддерживает как процедурный, так и объекто-ориентированные стили программирования. Программирование на PyQt4 предполагает ООП программирование.
class Icon(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
Три наиболее важные вещи в объекто-ориентированном программировании это классы, данные и методы. Здесь мы создаем новый класс Icon. Класс Icon наследован от класса QtGui.QWidget. Это значит, что мы должны вызвать два конструктора: во-первых, для класса Icon и, во-вторых, для наследованного класса.
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle(‘Icon’)
self.setWindowIcon(QtGui.QIcon(‘icons/web.png’))
Все три класса наследованы от класса QtGui.QWidget. Метод setGeometry() делает две вещи: он определяет положение окна и его размеры. Первые два параметра это координаты по оси X и Y соответственно. Третий задает ширину окна, а четвёртый высоту. Последний метод setWindowIcon() устанавливает иконку программы. Чтобы сделать это, мы создаём объект QIcon. В качестве параметра передаётся путь до файла иконки.
Всплывающая подсказка
Мы можем создать всплывающую подсказку для любого виджета.
#!/usr/bin/python
# tooltip.py
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class Tooltip(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle(‘Tooltip’)
self.setToolTip(‘This is a QWidget widget’)
QtGui.QToolTip.setFont(QtGui.QFont(‘OldEnglish’, 10))
app = QtGui.QApplication(sys.argv)
tooltip = Tooltip()
tooltip.show()
app.exec_()
В этом примере, мы показываем подсказку для виджета Qwidget.
self.setToolTip(‘This is a QWidget widget’)
Для создания подсказки вызываем метод setToolTip(). Можно использовать html тэги для форматирования.
QtGui.QToolTip.setFont(QtGui.QFont(‘OldEnglish’, 10))
Потому как обычный QtoolTip выглядит не лучшим образом, мы изменили его.
Закрытие окна
Самый очевидный путь закрытия окна, это щелкнуть на кнопке закрытия в заголовке окна. В следующем примере мы покажем как можно программно закрыть окно. Для этого мы кратко коснёмся сигналов и слотов.
QPushButton(string text, QWidget parent = None)
Это конструктор QPushButton, который мы будем использовать в нашем примере. Параметр text – это текст, который будет отображаться на кнопке, parent – тот виджет, на который мы поместим кнопку. В нашем случае это Qwidget.
#!/usr/bin/python
# quitbutton.py
import sys
from PyQt4 import QtGui, QtCore
class QuitButton(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle(‘Icon’)
quit = QtGui.QPushButton(‘Close’, self)
quit.setGeometry(10, 10, 60, 35)
self.connect(quit, QtCore.SIGNAL(‘clicked()’),
QtGui.qApp, QtCore.SLOT(‘quit()’))
app = QtGui.QApplication(sys.argv)
qb = QuitButton()
qb.show()
sys.exit(app.exec_())
quit = QtGui.QPushButton(‘Close’, self)
quit.setGeometry(10, 10, 60, 35)
Мы создаём кнопку и распологаем её на виджете также, как мы размещали виджет на экране.
self.connect(quit, QtCore.SIGNAL(‘clicked()’),
QtGui.qApp, QtCore.SLOT(‘quit()’))
Система обработки событий в PyQt4 построена на механизме сигналов и слотов. Если мы щёлкнем на кнопке, то будет послан сигнал clicked(). Слот может быть как слотом PyQt4 так и любым возможным для языка Пайтон. Метод QtCore.QObject.connect() соединяет сигнал и слот. В нашем случае слот является предопределённым слотов PyQt4.
Окно сообщений
Обычно, при щелчке на кнопке закрытия в заголовке окна виджет закрывается. Иногда нам нужно изменить это действие. Например, если у нас открыт файл в редакторе с которым мы сделали какие-то изменения. В этом случае мы показываем пользователю сообщение для подтверждения выбранного действия.
#!/usr/bin/python
# messagebox.py
import sys
from PyQt4 import QtGui
class MessageBox(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle(‘message box’)
def closeEvent(self, event):
reply = QtGui.QMessageBox.question(self, ‘Message’,
«Are you sure to quit?», QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
app = QtGui.QApplication(sys.argv)
qb = MessageBox()
qb.show()
sys.exit(app.exec_())
Когда мы закрываем виджет, генерируется событие QCloseEvent. Для изменения поведения виджета нам нужно изменить обработчик события QCloseEvent.
reply = QtGui.QMessageBox.question(self, ‘Message’,
«Are you sure to quit?», QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
Мы выводим сообщение с двумя кнопками “Да” и “Нет”. Первая строка (‘Message’) выводится в заголовке окна, вторая – текст сообщения. Возвращаемое значение хранится в переменной reply.
if reply == QtGui.QMessageBox.Yes:
event.accept()
else:
event.ignore()
Здесь мы проверяем возвращаемое значение: если щелкнули по кнопке “yes”, то мы принимаем стандартный обработчик, иначе – игнорируем закрытие.
P. S.: Продолжение следует…
Модуль QtGui
Этот модуль содержит в себе классы, необходимые для программирования графического интерфейса пользователя. В этот модуль входят около 300 классов. Вот некоторые из них:
- Класс QWidget – это базовый класс для всех элементов управления библиотеки Qt. По своему внешнему виду это не что иное, как заполненный четырёхугольник, но за этой внешней простотой скрывается большой потенциал непростых функциональных возможностей. Этот класс насчитывает 254 метода и 53 свойства. В главе 5 этому элементу уделено особое внимание;
- классы элементов отображения QLabel , QLCDNumber (см. главу 7);
- классы кнопок QPushButton , QCheckBox , QRadioButton (см. главу 8);
- классы элементов установок QSlider , QScrollBar (см. главу 9);
- классы элементов ввода QLineEdit , QSpinBox (см. главу 10);
- классы элементов выбора QComboBox , QToolBox (см. главу 11);
- классы меню QMainWindow , QMenu (см. главы 32 и 35);
- классы окон сообщений и диалоговых окон QMessageBox , QDialog (см. главу 33);
- классы для рисования QPainter , QBrush , QPen , QColor (см. главу 18);
- классы для растровых изображений QImage , QPixmap (см. главу 19);
- классы стилей QMotifStyle , QWindowsStyle и дуриге (см. главу 26). Как отдельному элементу, так и всему приложению может быть присвоен определённый стиль, изменяющий их вешний облик;
- класс приложения QApplication , который предоставляет цикл собитый.
Давайте рассмотрим немного подробнее последний класс, класс QApplication , с которым мы встречались в самом первом примере. Всё, что было сказано ранее о классе QCoreApplication , относится также и к этому классу, так как он является прямым его наследником. Объект класса QApplication представляет собой центральный контрольный пункт всех Qt-приложений, имеющих пользовательский интерфейс. Данный объект используется для получения событий клавиатуры, мыши, таймера и других событий, на которые приложение должно реагировать соответствующим образом. Например, окно даже самого простого приложенрия может быть изменено по величине или быть перекрыто окном другого приложения, и на все подобные события необходима правильная реакция. В назначение QApplication входит:
- установка стиля приложения. Таким образом можно устанавливать стиль Motif , Windows , а также многие другие виды и поведения (Look & Feel) приложения, включая и свои собственные (см. главу 26);
- получение указателя на объект рабочего стола (desktop);
- получение доступа к буферу обмена (см. главу 30);
- управление глобальными манипуляциями мышью (например, установка интервала двойного клика кнопкой мыши) и регистрация движения мыши в пределах и за пределами окна приложения;
- выдача предупрежающего звукового сигнала (см. главу 27);
- обеспечеие правильного завершнеия работающего приложения при завершении работы операционной системы (см. главу 29);
- инициализация необходимых настроек приложения, например, палитры для расцветки элементов упрваления (см. главу 13).
PyQt5: первые программы
Я начинаю перевод серии уроков PyQt5 от zetcode.
PyQt5 — это набор Python библиотек для создания графического интерфейса на базе платформы Qt5 от компании Digia.
Он доступен для Python 2.x и 3.x. Этот учебник использует Python 3.
Библиотека Qt является одной из самых мощных библиотек GUI (графического интерфейса пользователя).
Установить PyQt5 на Windows можно с официального сайта библиотеки.
Установить PyQt5 на linux-системы можно с помощью любого менеджера пакетов:
sudo apt-get install python3-pyqt5 pyqt5-dev-tools
PyQt5 реализован в виде набора python-модулей. Эта библиотека имеет более 620 классов и 6000 функций и методов.
Это мультиплатформенная библиотека, которая работает на всех основных операционных системах, в том числе Unix, Windows и Mac OS.
Простой пример
Это простой пример, показывающий небольшое окно. Тем не менее, мы можем многое сделать с этим окном. Мы можем изменить его размер, развернуть его или свернуть. Это требует написания значительного объёма кода. Однако кто-то уже запрограммировал эту функциональность до нас. Поскольку эта функциональность повторяется в большинстве приложений, нет необходимости писать её снова.
PyQt5 является инструментом высокого уровня. Если бы мы писали это на более низком уровне, следующий пример кода легко мог бы растянуться на сотни строк:
Приведенный выше код показывает небольшое окно на экране.
Здесь мы делаем необходимые импорты. Основные виджеты расположены в PyQt5.QtWidgets.
Каждое приложение PyQt5 должно создать объект приложения (экземпляр QApplication). Параметр sys.argv это список аргументов командной строки. Скрипты Python можно запускать из командной строки. Это способ, которым мы можем контролировать запуск наших сценариев.
Виджет QWidget это базовый класс для всех объектов интерфейса пользователя в PyQt5. Мы предоставляем конструктор по умолчанию для QWidget. Конструктор по умолчанию не имеет родителя. Виджет без родителей называется окно.
Метод resize() изменяет размеры виджета. Он стал 250 пикселей в ширину и 150 в высоту.
Метод move() двигает виджет на экране на координату x=300, y=300.
Здесь мы задаём заголовок нашего окна.
Метод show() отображает виджет на экране. Виджет сначала создаётся в памяти, и только потом (с помощью метода show) показывается на экране.
Наконец, мы попадаем в основной цикл приложения. Обработка событий начинается с этой точки. Основной цикл получает события от оконной системы и распределяет их по виджетам приложения. Основной цикл заканчивается, если мы вызываем метод exit() или главный виджет уничтожен. Метод sys.exit() гарантирует чистый выход. Вы будете проинформированы, как завершилось приложение.
Метод exec_ () имеет подчеркивание. Это происходит потому, что exec является ключевым словом в python 2.
Значок приложения
Значок приложения — небольшое изображение, которое обычно отображается в верхнем левом углу заголовка. В следующем примере мы покажем, как сделать это в PyQt5. Мы также представим некоторые новые методы.
Не забудьте также скачать какую-нибудь иконку 🙂
Предыдущий пример был написан в процедурном стиле. Язык программирования Python поддерживает как процедурный, так и объектно-ориентированный стили программирования. Программирование в PyQt5 означает программирование в ООП.
Три важные вещи в объектно-ориентированном программировании это классы, данные и методы. Здесь мы создаем новый класс Example. Класс Example наследуется от класса QWidget. Это означает, что мы вызываем два конструктора: первый для класса Example и второй для родительского класса. Функция super() возвращает родительский объект Example с классом, и мы вызываем его конструктор.
Создание GUI делегируется методу initUI().
Все три метода были унаследованы от класса QWidget.
Метод setGeometry() делает две вещи: помещает окно на экране и устанавливает его размер. Первые два параметра х и у — это позиция окна. Третий — ширина, и четвертый — высота окна. На самом деле, он сочетает в себе методы resize() и move() в одном методе.
Последний метод устанавливает иконку приложения. Чтобы сделать это, мы создали объект QIcon. QIcon получает путь к нашей иконке для отображения.
Создаются объекты application и Example. Запускается основной цикл.
Подсказки
Мы можем предоставить всплывающую подсказку для любого из виджетов.
QWidget widget'QPushButton widget'В этом примере мы покажем подсказку для двух виджетов PyQt5.
Этот статический метод устанавливает шрифт, используемый для отображения подсказки. Мы используем шрифт 10px SansSerif.
QWidget widget'Чтобы создать всплывающую подсказку, мы вызываем метод setToolTip(). Мы можем использовать форматирование текста.
QPushButton widget'Мы создаем виджет кнопки и устанавливаем подсказку для него.
Меняем размер кнопки и перемещаем относительно окна. Метод sizeHint() дает рекомендуемый размер для кнопки.
Закрытие окна
Очевидный способ закрыть окно, это нажать на крестик. В следующем примере мы покажем, как мы можем программно закрыть наше окно. Мы кратко рассмотрим сигналы и слоты.
В этом примере, мы создаем кнопку выхода. После нажатия на кнопку, приложение завершается.
Мы создаем кнопку. Кнопка является экземпляром класса QPushButton. Первый параметр конструктора - название кнопки. Вторым параметром является родительский виджет. Родительский виджет является виджетом Example, который наследуется от QWidget.
Система обработки событий в PyQt5 построена на механизме сигналов и слотов. Если мы нажмем на кнопку, вызовется сигнал "нажатие". Слот может быть слот Qt или любая Python функция.
QCoreApplication содержит главный цикл обработки; он обрабатывает и диспетчеризирует все события. Метод instance() дает нам его текущий экземпляр.
Обратите внимание, что QCoreApplication создается с QApplication. Сигнал «нажатие» подключен к методу quit(), который завершает приложение. Коммуникация осуществляется между двумя объектами: отправителя и приемника. Отправитель кнопка, приемник — объект приложения.
Message Box
По умолчанию, если мы нажмем на крестик, QWidget закрывается. Иногда мы хотим изменить это поведение по умолчанию, например, если у нас есть открытый файл, в котором мы сделали некоторые изменения. Мы показываем окно с сообщением для подтверждения действия.
Если мы закрываем QWidget, генерируется QCloseEvent. Чтобы изменить поведение виджета, нам нужно переопределить обработчик события closeEvent().
Мы показываем окно с сообщением и с двумя кнопками: Yes и No. Первая строка отображается в заголовке окна. Вторая строка является текстовым сообщением и отображается в диалоговом окне. Третий аргумент определяет комбинацию кнопок, появляющихся в диалоге. Последний параметр - кнопка по умолчанию. Это кнопка, на которой изначально установлен фокус клавиатуры. Возвращаемое значение хранится в переменной reply.
Здесь мы проверяем возвращаемое значение. Если мы нажмем на кнопку Yes, мы принимаем событие, которое приводит к закрытию виджета и приложения. В противном случае мы будем игнорировать событие закрытия.
Центрирование окна на экране
Следующий скрипт показывает, как мы можем центрировать окно на рабочем столе.
Класс QtWidgets.QDesktopWidget предоставляет информацию о компьютере пользователя, в том числе о размерах экрана.
Код, который будет центрировать окно, находится в нами созданном методе center().
Мы получаем прямоугольник, определяющий геометрию главного окна. Это включает в себя любые рамки окна.
Мы получаем разрешение экрана нашего монитора. И с этим разрешением, мы получаем центральную точку.
Наш прямоугольник уже имеет ширину и высоту. Теперь мы установили центр прямоугольника в центре экрана. Размер прямоугольника не изменяется.
Мы двигаем верхний левый угол окна приложения в верхний левый угол прямоугольника qr, таким образом, центрируя окно на нашем экране.
В этой части урока PyQt5 мы рассмотрели некоторые основы.
Для вставки кода на Python в комментарий заключайте его в теги
- Модуль csv - чтение и запись CSV файлов
- Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
- Онлайн-обучение Python: сравнение популярных программ
- Книги о Python
- GUI (графический интерфейс пользователя)
- Курсы Python
- Модули
- Новости мира Python
- NumPy
- Обработка данных
- Основы программирования
- Примеры программ
- Типы данных в Python
- Видео
- Python для Web
- Работа для Python-программистов
- Сделай свой вклад в развитие сайта!
- Самоучитель Python
- Карта сайта
- Отзывы на книги по Python
- Реклама на сайте
Tech Tips
Для работы с PyQt понадобится его установить. Так же будут нужны -devel файлы и Qt Designer. Установить можно через Add/Remove Software.
Кратко изложу принцип работы. Для начала создаем gui в Qt Designer. Затем используем его при написании программы в Python.
При создании графического интерфейса есть одна небольшая хитрость. Для того, чтобы заставить контейнер заполнить всю свободную область, необходимо нажать на него правой кнопкой мыши, перейти в меню Lay out и выбрать пункт Lay Out in a Grid.
При сохранении созданного пользовательского интерфейса, на выходе получается файл с расщирением *.ui. Есть два метода работы с ним.
Первый метод заключается в преобразовании полученного *.ui файла в *.py файл. Сделать это можно с помощью команды pyuic4 (если после набора в терминале этой команды видите сообщение, что она не найдена - проверьте, установили ли вы devel файлы).
pyuic4 main.ui > main.py
Символ > используется в windows-версии. Не уверен, нужен ли он вообще в linux.
Второй метод, который, как мне кажется, является более предпочтительным - это использование *.ui файла напрямую в вашем коде. Рассмотрим простой пример программного кода:
import sys
from PyQt4 import QtCore, QtGui, uic
import sbres_rc
class MyForm(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self)
self.ui = uic.loadUi('main.ui')
self.ui.show()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
myapp = MyForm()
sys.exit(app.exec_())
И все же без конвертации не обошлось. Если вы для иконок используете файл ресурсов с расширением *.qrc, то его необходимо сконвертировать в *.py файл. Для этого откройте терминал и запустите команду: