пятница, 14 сентября 2012 г.

PyQT Python

PyQT Python - это тулкит для разработки GUI приложений. Он представляет из себя смесь языка программирование Python и библиотеки Qt.

PyQt представляет из себя набор модулей Python. Она содержит более 300 классов и почти 6000 функций и методов. Это мультиплатформенный тулкит. Он работает на всех основных операционных системах, включая Unix, Windows и MacOS.

Начиная с версии PyQt 4 GPL доступна для всех поддерживаемых платформ.

Так как тулкит содержит большое количество классов, они распределены в несколько модулей.

Модули Python PyQt

Модули PyQt4

Модуль 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 содержит классы для работы с базами данных.

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

Код данного отображает небольшое окно. Однако вы сможете сделать с ним многое. Вы сможете изменить его размеры, распахнуть на весь экран, минимизировать.

#!/usr/bin/python
# simple.py

import sys
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

widget = QtGui.QWidget()
widget.resize(250, 150)
widget.setWindowTitle('simple')
widget.show()

sys.exit(app.exec_())

import sys
from PyQt4 import QtGui

Подключаем необходимые модули. Основные GUI виджеты находятся в библиотеке QtGui.

app = QtGui.QApplication(sys.argv)

Каждое приложение PyQt4 должно создать объект Qapplication. Этот объект находится в модуле QtGui. Параметр sys.argv это список аргументов командной строки. Скрипты Python могут быть запущены из консоли, и с помощью аргументов мы можем контролировать запуск приложения.

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 - это ключевое слово в Python.

Простое окно

Иконка приложения Python PyQT.

Иконка программы - это просто маленькое изображение, которое обычно отображается в левом верхнем углу заголовка. В следующем примере мы покажем как сделать это на PyQt. Мы также представим некоторые новые методы.

#!/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_())

В предыдущем примере код был процедурным. Python поддерживает как процедурный, так и объектно-ориентированный стиль программирования. Программирование на PyQt предполагает ООП программирование.

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. В качестве параметра передаётся путь до файла иконки.

 Иконка

Всплывающая подсказка Python PyQT.

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

#!/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 выглядит не лучшим образом, мы изменили его.

Всплывающая подсказка


Закрытие окна Python PyQT.

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

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()'))

Система обработки событий в PyQt построена на механизме сигналов и слотов. Если мы щёлкнем на кнопке, то будет послан сигнал clicked(). Слот может быть как слотом PyQt так и любым возможным для языка Python. Метод QtCore.QObject.connect() соединяет сигнал и слот. В нашем случае слот является предопределённым слотов PyQt.

Кнопка закрытия

Окно сообщений Python PyQT.

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

#!/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”, то мы принимаем стандартный обработчик, иначе – игнорируем закрытие.

Сообщение

Комментариев нет:

Отправить комментарий