# главное окно приложения расширяет класс QWidget
class MainWidget(QWidget):
# список предложений
strings = [«Раз два три», «Четыре пять шесть», «Семь восемь девять», «Просто тест», «Как так это»]
# конструктор
def __init__(self):
super().__init__()
# создаем кнопку
self.button = QPushButton(«Нажмите на меня!»)
# создаем текстовую метку отцентиророванную посередине контейнера
self.text = QLabel(«Привет, меня зовут PyQt.», alignment=Qt.AlignCenter)
# вертикальная разметка
self.layout = QVBoxLayout(self)
# добавляем виджеты в разметку
self.layout.addWidget(self.text)
self.layout.addWidget(self.button)
# назначаем обработчки для копки на событие клика
self.button.clicked.connect(self.randomSentence)
if __name__ == «__main__»:
# главный класс приложения принимает строку — заголовок окна
Делаем приложение на Python и PyQt5 / Урок #1
app = QApplication([‘Пример прииложения на PyQT’])
# создаем главный виджет размером 800×600 и отображаем его
widget = MainWidget()
widget.resize(800, 600)
widget.show()
Создано 18.11.2021 08:30:28
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Источник: myrusakov.ru
Интерфейс на Python: пишем с помощью PyQt
На языке Python написаны такие гиганты, как YouTube и Instagram. Если у вас в планах написать свой клевый сервис, то пора познакомиться с азами разработки UI.
Ранее мы уже познакомились с библиотекой PyQt и рассмотрели несколько простых примеров разработки приложений. Так же мы упомянули, что на Python написать код можно двумя способами: с помощью утилиты QtDesigner или вручную. Если вы выбрали второй вариант, то сегодня мы продолжим напишем простой пример интерфейса с PyQT с обработчиками и событиями. В прошлый раз мы пробовали написать небольшое окно с тулбаром
ПРОГРАММА КОНВЕРТЕР ВАЛЮТ с графическим интерфейсом на PyQT5 | PYTHON
Сигналы и слоты
Интерфейс — это связь между программой и пользователем. Главное, что нужно знать при разработке на PyQT — это такие определения как сигналы и слоты. Сигнал — это какое-либо событие, которые вы сделали в интерфейсе: нажали на кнопку мыши, выбрали какой-то элемент из выпадающего списка, изменили что-то или удалили. Создать сигнал можно при помощи ключевого слова emit().
Слот — это обработчик сигнала, т.е. когда срабатывает сигнал запускается обработчик. Это может быть встроенная или самописная функция или объект. Таким образом, слот — это обработчик, который выполняет действие, наступающее при срабатывании сигнала.
Какие бывают сигналы?
- clicked — Данный сигнал испускается при активизации кнопки (т.е. когда нажатая кнопка отпускается при нахождении указателя мыши внутри кнопки)
- pressed — Событие генерируется при нажатии кнопки мыши
- released — Событие генерируется при отпускании кнопки мыши (которая была нажата раньше)
- textChanged — генерация сигнала, когда происходит изменение текста (само изменение текста — это событие),
- valueChanged — генерация сигнала, когда происходит изменение значения
Что может служить слотом?
- Функция
- Метод класса
- Объект с методом вызова (__call__)
- Анонимная функция (lambda-функция)
- Слот класса (декоратор pyqtSignal — о нем ниже)
Пример:
Наша задача — создать объект и связать его с сигналом и реализовать обработчик этого самого сигнала. В теории это выглядит так
- Кнопка (список, элемент интерфейса). В общем, объект.
- Далее идёт событие (нажатие, клик).
- При наступлении п.2 (события) срабатывает сигнал
- Когда срабатывает п.3 (сигнал) вызывается обработчик
Сигнал может быть и встроенный, но мы напишем свой. Итак, у нас есть MainWindow — главное окно программы. Он наследуется от класса QMainWindow — встроенного класса, который импортируется из QWidget . Так же у нас есть класс для объектов — AnyObjects , который в свою очередь наследуется от QObject . Внутри него pyqtSignal() — это конструктор, который позволяет создать собственный сигнал
В MainWindow не забываем прописывать метод super().__init__() . Как мы помним это позволяет работать с атрибутами класса родителя. Обратите внимание на функцию set_params , вызываемой внутри класса. В ней мы и прописываем наш сигнал в виде объекта — self.ao = AnyObjects()
Когда мы кликаем на объект срабатывает событие (метод) mousePressEvent . Функция emit() служит как раз для генерации сигнала. Обработчиком в нашем примере является вызов функции on_clicked , которую мы написали ниже — она просто выводит сообщение в консоль. Функция on_clicked является слотом .
Обратите внимание, что в данном примере срабатывает два сигнала — собственный, который мы создали и встроенным — стандартным ( self.close — вызов функции закрытия окна). Именно поэтому при клике мы видим сообщение в консоли и наше окно закрываются.
import sys from PyQt5.QtCore import pyqtSignal, QObject from PyQt5.QtWidgets import QMainWindow, QApplication # базовый класс для всех объектов модуля class AnyObjects(QObject): # создаем свой сигнал own_signal = pyqtSignal() # создаем главное окно class MainWindow(QMainWindow): def __init__(self): super().__init__() self.set_params() # метод, который срабатывает при нажатии на окно def mousePressEvent(self, event): # генерируем сигнал self.ao.own_signal.emit() self.close() def set_params(self): self.ao = AnyObjects() # обработчик сигнала, связанного с объектом self.ao.own_signal.connect(self.on_clicked) # параметры главного окна self.setGeometry(900, 300, 290, 150) self.setWindowTitle(‘Пример работы самописного сигнала’) self.show() def on_clicked(self): print(‘Тут сообщение’) if __name__ == ‘__main__’: app = QApplication(sys.argv) mw = MainWindow() sys.exit(app.exec_())
Результат при запуске:
Результат после клика по окну (1 — оно закрылось, 2 — вывелось сообщение)
Создание слайдера и прогресс-бара
Несмотря на то, что программисты во многом считаются адептом машинного кода, некоторые элементы интерфейса можно сделать через QtDesigner. Таковыми являются слайдер (ползунок, который меняет какой-либо параметр) и прогресс бар (заполняющаяся линейка при ожидании завершении процесса). Их можно сделать в качестве отдельных модулей и импортировать в главный скрипт
Файлы имеют расширение UI (UserInterface) и являются обычным XML-кодом. Их можно программно перевести в py-файлы — мы их не создаем вручную
Фоновые задачи с помощью PyQt на Python
Все библиотеки для разработки приложений работают с главным циклом, который обрабатывает такие события, как отображение окна на экране, его перемещение, изменение размера, реакция на нажатие кнопки. Словом, любое взаимодействие с интерфейсом.
Некоторые из этих событий могут быть связаны с функцией, которую мы предоставляем.
Например, метод button1_pressed(), который вызывается этой библиотекой, когда пользователь нажимает на элемент управления button1.
При работе с Qt способ реагирования на эти события обычно заключается в подключении сигнала к слоту.
Проблема возникает, когда в ответ на одно из этих событий или во время создания интерфейса мы выполняем операцию, длительность которой оказывается значительной (можно сказать, что это любая задача, занимающая более секунды).
Это приводит к тому, что процессор занят выполнением нашей задачи и не может заниматься основным циклом приложения.
В результате интерфейс перестает отвечать на запросы: мы не можем переместить его, закрыть, изменить размер или выполнить любой другой тип взаимодействия с ним.
Перейдем к конкретному примеру.
Следующий код дублирует окно с меткой (QLabel) и кнопкой (QPushButton), которая при нажатии загружает файл, используя стандартный модуль urllib.request.
#!/usr/bin/env python # -*- coding: utf-8 -*- from urllib.request import urlopen from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle(«Пример загрузки файла») self.resize(400, 300) self.label = QLabel(«Нажмите кнопку, чтобы начать загрузку.», self) self.label.setGeometry(20, 20, 200, 25) self.button = QPushButton(«Начать скачивание», self) self.button.move(20, 60) self.button.pressed.connect(self.downloadFile) def downloadFile(self): self.label.setText(«Загрузка файла. «) # Отключение кнопки во время загрузки файла. self.button.setEnabled(False) url = «https://www.python.org/ftp/python/3.7.2/python-3.7.2.exe» filename = «python-3.7.2.exe» # Открываем URL. with urlopen(url) as r: with open(filename, «wb») as f: # Чтение удаленного файла и запись локального файла. f.write(r.read()) self.label.setText(«Файл загружен!») # Сброс кнопки. self.button.setEnabled(True) if __name__ == «__main__»: app = QApplication([]) window = MainWindow() window.show() app.exec_()
Вы заметите, что во время загрузки, которая в моем случае длится около пяти секунд, интерфейс полностью замирает.