Archy
В этой части руководства по программированию с PyQt5
мы изучим события и сигналы, встречающиеся в приложениях.
События
Все приложения с графическим интерфейсом являются событийно-ориентированными. События вызываются главным образом пользователем приложения. Однако, они могут быть вызваны другими средствами, к примеру подключением к Интернету, диспетчером окон или таймером. Когда мы вызываем метод exec_(), приложение входит в главный цикл. Главный цикл получает события и отправляет их объектам.
В событийной модели имеются три участника:
- Источник события;
- Объект события;
- Цель события.
Источник события – это объект, состояние которого меняется. Он вызывает события. Объект события (событие) внедряет состояние, которое меняется в источнике события. Цель события – это объект, которому требуется уведомление. Объект источника события поручает задачу обработки события цели события.
Чтобы начать работу с событиями, PyQt5 имеет уникальный механизм сигналов и слотов. Сигналы и слоты используют для связи между объектами. Сигнал срабатывает, когда происходит конкретное событие. Слот может быть чем-то, вызываемым средствами Python. Слот вызывается, когда срабатывает его сигнал.
Существенная сторона в программировании графических приложений – управление макетом. Управление макетом – это способ, которым мы размещаем виджеты в окне приложения. Управление может быть выполнена двумя основными путями. Мы можем использовать абсолютное позиционирование или классы макета.
Абсолютное позиционирование
Программист указывает позицию и размер каждого виджета в пикселях. При использовании абсолютного позиционирования, мы должны понимать следующие ограничения:
- Размер и позиция виджета не меняются, если мы меняем размер окна
- Приложения могут выглядеть по-разному на разных платформах
- Изменение шрифтов в нашем приложении может испортить макет
- Если мы решаем изменить наш макет, мы должны полностью переделать его, что утомительно и время-затратно.
Следующий пример размещает виджеты в абсолютных координатах.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QWidget, QLabel, QApplication
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lbl1 = QLabel('Zetcode', self)
lbl1.move(15, 10)
lbl2 = QLabel('tutorials', self)
lbl2.move(35, 40)
lbl3 = QLabel('for programmers', self)
lbl3.move(55, 70)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Absolute')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Далее...
В этой части руководства PyQt5, мы будем создавать меню и панели инструментов. Меню – это группа команд, располагающаяся ниже строки заголовка программы. Панель инструментов содержит кнопки с несколькими распространенными командами в приложении.
Основное окно
Класс QMainWindow предоставляет главное окно приложения. Он позволяет создать классический каркас приложения со строкой состояния, панелями инструментов и меню.
Строка состояния
Строка состояния – это виджет, который используется для отображения сведений о состоянии.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
class Example(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusBar().showMessage('Ready')
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Statusbar')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
Далее...
В этой части руководства PyQt5
мы изучим некоторую базовую функциональность.
Этот простой пример выводит маленькое окно. Мы можем делать множество вещей с этим окном. Мы можем менять его размер, раскрывать на весь экран или свернуть в панель задач. Это потребовало бы много программного кода. Кто-то уже запрограммировал эту функциональность. Поскольку это повторяется в большинстве приложений, нет необходимости программировать это с самого начала. PyQt5 – это инструментарий высокого уровня. Если бы мы писали с помощью инструментов более низкого уровня, нижеследующий пример кода мог бы с лёгкостью содержать сотни строк.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QWidget
if __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_())
Далее...
Это введение к руководству по PyQt5. Назначение этого руководства – дать вам представление об возможностях PyQt5.
Руководство было разработано и протестировано на Linux.
Про PyQt5
PyQt5 – это набор Python-связей для фреймворка Qt5 от Digia. Набор PyQt5 доступен для Python 2.x и 3.x. Это руководство рассматривает Python 3. Библиотека Qt – это одна из самых мощных GUI-библиотек. Официальный сайт PyQt5 - www.riverbankcomputing.co.uk/news. PyQt5 разработан компанией Riberbank Computing.PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов. Это мульти-платформенный инструментарий, который запускается на большинстве операционных систем, среди которых Unix, Windows и MacOS. PyQt5 реализован под двумя лицензиями. Разработчики могут выбрать между GPL и коммерческой лицензией.
Проблема: У вас есть N-ое кол-во элементов кортежа или последовательность, и вы хотите их распаковать в N-ое кол-во уникальных переменных.
Решение: Любая последовательность (или итерацию) могут быть распакованы в переменных, используя операцию назначения "=". Единственное требование состоит в том, что число переменных и элементов структуры должны соответствовать последовательности.
Модуль random - генерация случайных чисел
Модуль random позволяет генерировать случайные числа. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции:
import random
Перечислим основные функции
random() - возвращает псевдослучайное число от 0.0 до 1.0
>>> import random
>>> random.random()
0.7466459239415119
>>> random.random()
0.4908688798600912
>>> random.random()
0.5724365575322524
seed(<Параметр>) - настраивает генератор случайных чисел на новую последовательность. По умолчанию используется системное время. Если значение параметра будет одиноким, то генерируется одинокое число:
>>> random.seed(20)
>>> random.random()
0.9056396761745207
>>> random.seed(20)
>>> random.random()
0.9056396761745207
Далее...
Здравствуйте, здравствуйте и еще раз здравствуйте! Сегодня хотелось бы посвятить вас в такую тему, как разбор разметки страниц html, используя для этого Python+lxml. На самом деле, это не так сложно, как кажется, поэтому вы с легкостью сможете обуздать довольно простые правила касательно этого процесса. Что такое lxml? Это удобная в работе библиотека, которая позволяет обрабатывать разметку, как html , так и xml, при помощи языка Python. Стоит также отметить ее уникальную способность разбития частей документа в дерево. Итак, приступим.
Какую цель вы будете преследовать, создавая парсинг?
Сейчас многие занимаются различными видами спорта, поэтому в качестве примера возьмем данную тематику. Предположим, что нас заинтересовало количество совершенных болевых приемов, которые были зафиксированы в момент проведения мировых турниров по ММА. Недолго думая, я воспользовался гуглом и смог подыскать для себя подходящий сайт, где мне удалось получить доступ к требуемым данным. Она подразумевает собой полную информацию по всем проведенным турнирам в категории смешанные единоборства.Правда, нельзя не упомянуть про один важный нюанс: предоставленную информацию было крайне сложно анализировать. Получается, что статистика для всех турниров находилась не на одной странице, а была разбита на несколько частей, каждая из которых была на разных страницах, что и причиняет главный дискомфорт. Это же можно сказать и про возможность удобного просмотра названия турнира, а также дату его проведения. Для того, чтобы не клацать по сто раз по разным страницам и запоминать информацию на них, будет разумно создать специальный парсер, который в значительной степени облегчит процесс анализа всех данных.
Согласно спецификации DB-API 2.0 после создания объекта соединения необходимо создать объект-курсор. Все дальнейшие запросы должны производиться через этот объект. Создание объекта-курсора производится с помощью метода cursor(). Для выполнения запроса к базе данных предназначены следующие методы объекта-курсора:
close() - закрывает объект-курсор
executescript(<Запросы SQL через точку с запятой>) - выполняет несколько SQL запросов за один раз. Если в процессе выполнения запросов возникает ошибка, то метод возбуждается исключение. В качестве примера создадим базу данных и три таблицы в ней:
# -*- coding: utf-8 -*-
import sqlite3
con = sqlite3.connect("catalog.db")
cur = con.cursor() # Создаем объект-курсор
sql = """\
CREATE TABLE user (
id_user INTEGER PRIMARY KEY AUTOINCREMENT,
email text,
passw text
);
CREATE TABLE rubr (
id_rubr INTEGER PRIMARY KEY AUTOINCREMENT,
name_rubr TEXT
);
CREATE TABLE site (
id_site INTEGER PRIMARY KEY AUTOINCREMENT,
is_user INTEGER,
id_rubr INTEGER,
url TEXT,
title TEXT,
iq INTEGER
);
"""
try: # обработка исключения
cur.executescript(sql) # Выполняем SQL-запрос
except sqlite.DatabaseError, err:
print u"Ошибка:", err
else:
print u"Запрос успешно выполнен"
cur.close() # Закрываем объект-курсора
con.close() # Закрываем соединение
raw_input()
Далее...
Для создания и открытия базы данных используется функция connect(). Функция имеет следующий формат:
connect(database[, timeout][, isolation_level][, detect_types][, factory])
В параметре database указывается абсолютный или относительный путь к базе данных. Если база данных не существует, то она просто открывается без удаления имеющихся данных. Вместо пути к базе данных можно указать значение :memory:, которое означает, что база данных будут удалены.
Все остальные параметры являются необязательными и могут быть указаны в произвольном порядке путем присвоения значения названию параметра. Необязательный параметр timeout задает время ожидания снятия блокировки с открываемой базы данных. По умолчанию значение параметра timeout равно пяти секундам. Предназначение остальных параметров мы рассмотрим немного позже.
Возникли вопросы по Python?
- Python для начинающих 71
- Python и запуск програм 16
- SQLite 12
- Веб-программирование 7
- Взаимодействие с Интернетом 401
- Видео уроки 7
- Запуск программ на Python 4
- Изучение PyQt5 12
- Изучение wxPython 1
- Модули 8
- Обработка исключений 3
- Общие вопросы 190
- ООП на Python 12
- Примеры Python 30
- Работа с изображениями 4
- Разработка интернет-приложений 8
- Как использовать proxy с помощью библиотеки Requests?
- Как работают функции в Python?
- Топ наиболее востребованных языков программирования
- Изучение языка программирования Python с помощью Brain Up!
- Распаковка последовательности в отдельные переменные
- Создание своего веб-фреймворка на Python - Часть 1
- Какая версия Python самая быстрая?