Pyqt5 как открыть файл
На этом уроке мы рассмотрим работу с файлами и каталогами в Qt5. Для этого мы будем использовать следующие классы:
QFile , QDir и QFileInfo — основные классы для работы с файлами в Qt5;
QFile — предоставляет интерфейс для чтения и записи информации в файлы;
QDir — обеспечивает доступ к структуре каталогов и к их содержимому;
QFileInfo — предоставляет информацию о файле, включая его имя и расположение в файловой системе, время доступа и изменения, имя владельца файла и текущие разрешения.
Размер файла
Для определения размера файла в классе QFileInfo предусмотрен метод size():
// Имя файла передается в качестве аргумента в нашу программу qWarning ( "The file does not exist" ) ; // если файл не найден, то выводим предупреждение и завершаем работу программы qint64 size = fileinfo . size ( ) ; // qint64 - это тип данных, который гарантированно будет 64-битным на всех платформах, поддерживаемых QtДля запуска программы проделайте следующие шаги:
ПОДГОТОВКА:
Шаг №1: Скомпилируйте вашу программу. Для этого выберите в меню "Сборка" > "Собрать всё" (или нажмите Ctrl+Shift+B ).
Шаг №2: Зайдите в папку, где лежит ваш Qt-проект (у меня он расположен в C:\dev\Qt_Project ).
Шаг №3: После выполнения первого шага у вас должна появиться еще одна папка, в которой будет создан исполняемый файл программы. Т.к. я использую компилятор MinGW 32-bit и режим компиляции Debug, то при компиляции проекта Qt автоматически создал папку build-My_QtApplication-Desktop_Qt_5_13_0_MinGW_32_bit-Debug .
Шаг №4: Зайдите в папку debug (она находится внутри папки, созданной на шаге №3).
Шаг №5: Найдите *.exe-файл вашей программы (у меня это file_size.exe ).
Шаг №6: Скопируйте этот файл в папку к соответствующему компилятору (напомню, т.к. я использовал компилятор MinGW 32-bit, то у меня этот путь выглядит следующим образом: C:\Soft\Qt\5.13.0\mingw73_32\bin ).
ЗАПУСК ПРОГРАММЫ:
Шаг №7: Откройте командную строку.
Шаг №8: Перейдите в папку, указанную в шаге №6 ( cd C:\Soft\Qt\5.13.0\mingw73_32\bin ).
Шаг №9: Запустите свою программу, передав ей в качестве параметра имя любого файла (у меня этим файлом оказалась эта же программа, поэтому в моем случае команда была следующей: file_size.exe file_size.exe ).
Результат выполнения программы:
Чтение содержимого файлов
Для того, чтобы прочитать содержимое файла, мы должны сначала открыть этот файл в режиме чтения, затем создать входящий файловый поток, из которого мы будем считывать данные. В примере, приведенном ниже, мы считываем данные из файла C:\colours.txt . Файл содержит названия семи цветов, вот его содержимое:
Red
Green
Black
Yellow
Purple
Blue
White
Диалоговые окна (диалоги) являются неотъемлемой частью большинства современных графических приложений. Диалог в обычной жизни - это беседа между двумя и более людьми. В компьютерном приложении, диалог – это окно, которое используется, чтобы «беседовать» с приложением. Диалоги используются для ввода и изменения данных, изменения настроек приложения, и так далее.
QInputDialog
QInputDialog - простой удобный диалог для получения единственного значения от пользователя. Введённое значение может быть строкой, числом или пунктом из списка.
Пример имеет кнопку и виджет редактирования строки. Кнопка показывает диалог ввода. Вводимый текст может быть отображён в виджете редактирования строки.
Текст, который мы получили из диалога, устанавливается в виджет редактирования строки.
QColorDialog
QColorDialog - виджет диалога для выбора цветовых значений.
Пример приложения показывает кнопку и QFrame. Фон виджета устанавливается чёрным. Используя QColorDialog, мы можем менять фон.
Это первоначальный цвет фона QtGui.QFrame.
Это строка высветит QColorDialog.
Мы проверяем, является ли цвет валидным. Если мы нажимаем кнопку «Cancel», возвращается невалидный цвет. Если цвет валиден, мы меняем цвет фона, используя таблицы стилей (CSS).
QFontDialog
QFontDialog – это виджет диалога для выбора шрифта.
В нашем примере, мы имеем кнопку и метку. С помощью QFontDialog, мы меняем шрифт метки.
QFileDialog
QFileDialog – это диалог, который позволяет пользователям выбирать файлы или папки. Файлы могут быть выбраны и для открытия, и для сохранения.
Пример показывает строку меню, виджет редактирования текста и строку состояния. Пункт меню показывает QtGui.QFileDialog, который используется для выбора файла. Содержимое файла загружается в виджет редактирования текста.
Мы показываем QFileDialog. Первая строка в методе getOpenFileName() – это заголовок. Вторая строка указывает на показываемую директорию. По умолчанию, файловый фильтр установлен в положение «Все файлы (*)».
Выбранный файл читается и содержимое файла записывается в виджет редактирования текста.
Руководство по работе с библиотекой Qt с использованием Python 3
Установка необходимых компонентов для работы
Установить Python версии не менее 3.5.
В операционных система семейства Unix процесс установки сводится к запуску пакетного менеджера с выбором необходимого пакета.
Пример установки Python 3 в Ubuntu:
По умолчанию, путь к интерпретатору Python 3 при установке на любой операционной системе добавляется к переменной среды PATH. В Windows для запуска интепретатора достаточно набрать в консоли:
В Unix системах, как правило, может быть уже установлена более ранняя версия интерпретатора, поэтому для корректного запуска 3-ей ветки Python рекомендуется выполнить в терминале команду:
В Python установка сторонних библиотек (или пакетов) происходит с помощью пакетного менеджера pip.
По умолчанию, в Windows при установке самого интерпретатора устанвливается и пакетный менеджер.
В Unix системах установка пакетного менеджера pip происходит отдельно.
Пример установки pip в Ubuntu:
Установка сторонних пакетов (библиотек) сводится к следующей команде в терминале Unix/консоли Windows:
pip автоматически найдет, скачает и установит необходимый пакет из сети интернет.
Для установки библиотеки Qt следует выполнить следующую команду:
Основы работы с Qt
Библиотека Qt является кросплатформенной и предназначена для написания графических приложений. Она инкапсулирует в себе все основные понятия любой из операционных графических систем: окна, фреймы, модальные диалоги, кнопки, текстовые поля, панели и т.д. Ядро библиотеки и всех ее компонентов написаны на языке программирования C++. Библиотека не является монолитной и разбита на несколько основных модулей, которые содержат классы для работы с графикой, сетью, файлами, аудио/видео, потоками ОС и т.д.
Пакет PyQt5 является портом для работы с Qt на языке Python. Ввиду этого, пакет наследует основные названия модулей библиотеки и их классов. Однако, в отличие от процесса работы на C++ под Qt, работа на языке Python с использованием пакета PyQt5 избавляет программиста от низкоуровневых особенностей C++ и ускоряет процесс написания программного кода. В пользу PyQt5 стоит сказать, что скорость понимания абстракций графического интерфейса, написанных на языке Python, бывает более высокой, нежели на C++.
Как правило, процесс ознакомления с PyQt5 тесно связан с чтением документации по тому или иному классу. Однако, стоит заметить, что все описания классов модулей Qt представлены на языке C++. Но такие понятия, как классы, его атрибуты и методы в языке C++ интуитивно легко перекладываются на язык Python. Тем самым, любые описания и примеры использования того или иного атрибута/метода на языке C++ в документации Qt справедливы и для Python, где любые упоминания про указатели и ссылки просто опускаются при работы с PyQt5.
На данный момент библиотека Qt развивается в двух направлениях: Qt Widgets и Qt Quick. Qt Widgets является фундаментальным и базовым направлением библиотеки. Данный модуль существует с момента сущестования платформы и направлен на создания графических приложений в стиле объектно-ориентированного подхода, где любой компонент интерфейса представлен объектом класса, тем самым организуя весть графический интерфейс пользователя в иерархию объектов. Qt Quick является более современным ответвлением платформы Qt. Данное направление вводит новые высокоуровневые абстракции вроде машины конечного автомата и вносит принципы реактивного программирования. Также, Qt Quick предлагает идею декларативного описания пользовательского интерфейса средствами JavaScript подобного языка QML.
В данном руководстве описываются базовые принципы работы с Qt Widgets совместно с пакетом PyQt5.
1. Основной цикл обработки событий
Приложение Qt построено на основе бесконечного цикла, который обратывает события: события операционной системы, события пользоваля приложения (поведение мыши, использование клавиатуры). Для запуска минимального приложения, следует передать циклу контекст, в котором начнут обрабатываться события. Базовым контекстом является понятие Виджет, которое представлено классом QWidget.
Виджет - это аналог окна, которое как может иметь рамку, кнопки сворачивания и закрытия, а может их и не иметь. С точки зрения операционных систем, это именно контекст, где операционная система может реагировать на события пользователя. В Qt виджеты могут содержать иерархию из других виджетов. При этом, разработчик никак не ограничен тем, как будет выглядеть виджет. Им могут быть как стандартное текстовое поле, кнопка, текстовая метка, так и сложный графический объект со своим стилем прорисовки.
Минимальное приложение Qt состоит из определения класса наследника QWidget, создания его экземпляра и запуска бесконечного цикла обработки событий.
Как было сказано, виджет представлен классом QWidget. Для создания виджета следует определить класс-наследник QWidget. В конструкторе класса следует добавить последний аргумент по умолчанию parent и вызвать инструкцию:
Параметр parent указывает на родительский виджет описываемого. Если описываемый является корневым, parent = None. Стоит сказать, что создание любого другого дочернего виджета, разметки должно просходить с передачей последним аргументом родительского виджета parent. Наиболее часто, родителем оказывается описываемый виджет self.
Часто, виджетам устанавливают ту или иную разметку, по правилам которой внутри располагаются другие виджеты. Наиболее используемыми классами разметки являются QVBoxLayout (вертикальная разметка) и QHBoxLayout (горизонтальная разметка). Для добавления дочерних виджетов в разметку предназачен метод addWidget(QWidget). Чтобы установить виджету ту или иную разметку используется метод setLayout(QLayout).
Хорошим стилем считается создание всех дочерних разметок/виджетов описываемого в теле контструктора класса. Как правило, создается приватный метод, например _initUI, и вызывается в конструкторе __init__.
Qt предоставляет набор удобных стандартных виджетов, поведение которых также можно изменить определением нового класса-наследника.
2.1 Текстовая метка: QLabel
Часто используемые методы:
- text() → string: возвращает текст метки.
- setText(string): устанавливает текст метки.
2.2 Текстовое поле: QLineEdit
Часто используемые методы:
- text() → string: возвращает текст поля ввода.
- setText(string): устанавливает текст поля ввода.
2.3 Кнопка: QPushButton
Часто используемые методы:
2.4 Многострочное поле ввода: QTextEdit
Часто используемые методы:
- setText(string): устанавливает текст в поле ввода.
- toPlainText() → string: возвращает обычный текст.
- toHtml() → string: возврашает текст в формате HTML.
2.5 Слайдер: QSlider
Часто используемые методы:
- setTickInterval(int): устанавливает шаг.
- tickInterval() → int: возвращает шаг.
- setMinimum(int): устанавливает минимальное значение.
- setMaximum(int): устанавливает максимальное значение.
2.6 Чек-бокс: QCheckBox
Часто используемые методы:
3. Взаимодействие с пользователем: введение в сигналы/слоты
В библиотеке Qt любые из классов, которые являются наследниками класса QObject могут участвовать в механизме сигналов/слотов. Практически все классы Qt являются наследниками QObject, в том числе и виджеты.
Механизм сигналов/слотов - является базовым понятием в обработке событий. Событиями могут выступать: действия пользователя графического интерфейса, события операционной системы и т.д. Само понятие события в Qt носит название Сигнал. Реакция на сигнал это всегда какая-либо простая функция, которая носит название Слот.
Как правило, дочерние компоненты описываемого виджета генерируют какие-либо сигналы. Например, сигнал клика по кнопке. Для реакции на данное событие создается метод внтури описываемого виджета. Стоит упомянуть, что сигнал может передавать любую порцию информации: число, строка, список и т.д.. Если сигнал отправляет какие-либо данные, то в методе на реакцию данного сигнала должен передаваться аргумент(ы) для обработки передаваемой информации.
Пример использования механизма сигналов/слотов:
Как видно из примера, виджет sld генерирует сигнал valueChanged, информирующий об изменении позиции слайдера. В свою очередь, данный сигнал связан с методом display виджета lcd. В данном случае, valueChanged является сигналом и отсылает значение типа int, а display является методом-сигналом, в который передается значение типа int. Связывание сигнала и слота происходит с помощью метода сигнала connect, который имеется у любого сигнала Qt.
Для определения слота, следует создать метод у класса описываемого виджета и привязать нужный сигнал к новому слоту с помощью метода сигнала connect.
Пример определения слота:
Чтобы определить слот, который реагирует на сигналы, отправляющие какую-либо информацию, следует лишь добавить аргумент(ы).
Пример определения слота на сигнал, передающий значение типа int:
Виджет slider генерирует сигнал valueChanged при изменении слайдера. В свою очередь, данный сигнал связан с слотом/методом _handleChangeSlider, который принимает аргумент value типа int. При любом изменении слайдера вызывается метод _handleChangeSlider, который устанавливает текст метке label на значение ползунка слайдера. Стоит сказать, что метод метки label.setText принимает строковое значение, поэтому значение, отправляемое сигналом, числового типа int явно приводится к строковому типу str.
В документации библиотеки Qt к тому или иному классу виджета все сигналы находятся в секции Signals. Особое внимание стоит обращать на типы данных, которые возвращают сигналы.
Введение в тему
В данном уроке по PyQt5 мы изучим, как использовать Пайтон и Qt для создания графического интерфейса пользователя в самых распространённых операционных системах.
Что такое pyqt5
PyQt – это модуль, предназначенный для создания графических интерфейсов в Python через библиотеку Qt. Эта библиотека написана на языке C++ и является одним из самых популярных инструментов разработки GUI, а также имеет обширное сообщество. Существует и альтернатива: модуль PySide. Различаются они тем, что PyQt нельзя свободно использовать в коммерческих проектах, однако, этот модуль, всё же, более зрелый. Существуют и другие распространённые средства создания графических интерфейсов:
Установка pyqt
Устанавливать модуль будем в виртуальную среду. Для этого вводим в консоли:
Эта команда создаст папку venv/. Чтобы запустить виртуальную среду в ОС Windows, выполните следующую команду:
Для остальных ОС это делается так:
Если всё получилось, в начале строки в терминале появится префикс (venv).
Теперь, для установки PyQt с помощью pip, выполните следующую команду:
Создание gui графического интерфейса пользователя
Теперь можно приступить к созданию интерфейса. Сперва модуль надо импортировать:
Теперь необходимо создать объект приложения QApplication при помощи следующей команды:
В объект приложения необходимо передавать список аргументов. В данном случае он пустой [], но, общепринятая практика писать следующим образом:
sys.argv – аргументы командной строки и теперь Вы можете запустить свой скрипт из консоли, передав при этом какие-то аргументы.
Дальше нужно создать виджет (о них мы поговорим чуть позже):
На данный момент наш маленький интерфейс готов, но, чтобы его увидел пользователь, надо использовать метод show:
Внешний вид будет зависеть от Вашей операционной среды.
Осталось запустить приложение:
После этой команды скрипт попадает в цикл обработки событий. Благодаря этому, мы можем понимать, что делает пользователь: заполняет поля, нажимает кнопки и так далее. Хороший вариант обрабатывать закрытие окна:
Метод sys.exit() обеспечивает чистый выход. Вы сможете узнать, как завершилось приложение.
Виджеты
Виджеты – это все видимые части интерфейса. Они могут быть вложены друг в друга.
На этом изображении представлены самые часто встречающиеся виджеты:
Они перечислены ниже в порядке сверху вниз и слева направо:
Есть ещё несколько важных методов виджетов, о которых нельзя не рассказать:
setWindowTitle() – устанавливает название окна.
Макеты
Чаще всего приложение состоит из целого набора виджетов. Если так, то нужно объяснить Qt, как их разместить внутри окна. Например, вы можете использовать QHBoxLayout для горизонтального расположения виджетов:
Листинг кода, создающего окно, представленное на изображении выше:
Что здесь происходит? Сперва мы импортируем необходимые модули, затем создаём объект приложения. Создаём виджет типа QWidget. Это базовый тип, не имеющий поведения. Дальше инициируем макет (mylayout), а в нём две кнопки QPushButton. Строка mywindow.setLayout(mylayout) говорит QT что для виджета mywindow будет использоваться именно этот макет. Делаем всё это видимым и запускаем.
Qt включает набор классов управления компоновкой, которые используются для описания компоновки виджетов в пользовательском интерфейсе приложения. Эти макеты автоматически позиционируют и изменяют размер виджетов, когда объем доступного для них места изменяется, гарантируя, что они единообразно расположены и пользовательский интерфейс в целом остается пригодным для использования. Вот список макетов:
QHBoxLayout – располагает виджеты горизонтально.
QGridLayout – сеточный макет. Этот макет делит пространство на строки и столбцы.
Если Вы знакомы с языком CSS, то, конечно же, заметили что QHBoxLayout и QVBoxLayout похожи на flexbox, а QGridLayout – на grid.
PyQt5 — это модуль Python для разработки настольных приложений с графическим интерфейсом пользователя. Он доступен для нескольких платформ, таких как Windows, Mac, Linux, iOS и Android. Python предлагает несколько модулей, которые фактически поддерживают разработку графического интерфейса, например Tkinter, wxPython, PySide2 и другие. Однако PyQt5 использует более 1000 классов; на самом деле PyQt5 — это огромный модуль! Кроме того, PyQt5 включает Qt Designer, конструктор графического пользовательского интерфейса, который еще больше упрощает создание графического интерфейса. Его можно использовать для создания чего угодно, от медиаплееров до веб-браузеров. В этом руководстве мы изучим основы модуля PyQt5.
Сначала установим PyQt5
pip install pyqt5
pip install pyqt5-tools
ШАГ 1: СОЗДАНИЕ ПУСТОГО ОКНА
Первый шаг в создании чего-либо — установка пустого окна. Само пустое окно требует нескольких строк кода, так что давайте посмотрим на это.
from PyQt5 import QtWidgets
from PyQt5. QtWidgets import QApplication , QMainWindow
import sys
from PyQt5 import QtGui
class window ( QtWidgets. QWidget ) :
def __init__ ( self ) :
super ( ) . __init__ ( )
Задайте геометрию окна с помощью метода setGeometry (), который принимает четыре аргумента — начальную позицию по оси x, начальную позицию по оси y (другими словами, где на экране появляется верхний левый угол), ширину и высоту окна. окно.
self . setGeometry ( 350 , 100 , 800 , 600 )
Задайте заголовок окна с помощью метода setWindowTitle ().
Вы можете установить значок с помощью setWindowIcon (). Обратите внимание, что размер значка должен составлять 64 на 64 пикселя.
Каждому файлу PyQt5 требуется следующая строка, которая принимает в качестве аргумента sys.argv.
application = QApplication ( sys . argv )
Затем создайте экземпляр класса, который мы создали выше.
Для выхода из окна по нажатию кнопки X нам понадобится sys.exit (application.exec ()).
Этот код создаст пустое окно. Код в целом будет выглядеть так:
ШАГ 2: ВВОДНАЯ ПАНЕЛЬ
Далее давайте создадим панель ввода. Панель ввода — это место, где пользователи могут добавлять текст, который мы можем извлечь. Полосы ввода создаются с помощью QWidgets.QLineEdit (). Очевидно, мы задаем его геометрию с помощью метода setGeometry ().
def initUI ( self ) :
self . input_bar = QtWidgets. QLineEdit ( self )
self . input_bar . setGeometry ( 150 , 250 , 500 , 40 )
Имейте в виду; вам все равно нужно активировать функцию в методе __init__ следующим образом:
Полный код на этом этапе будет выглядеть так:
ШАГ 3: СОЗДАНИЕ КНОПОК
Теперь давайте добавим несколько кнопок на пустой холст. Итак, напишем код для кнопки. Для кнопки мы используем QtWidgets.QPushButton (). Как обычно, мы можем задать его геометрию с помощью метода setGeometry ().
Установите значок с помощью метода setIcon ().
Установите стиль текста с помощью метода setStyleSheet (). Вы можете, среди прочего, изменить цвет, толщину и размер шрифта.
Чтобы кнопка выполняла какие-либо действия при нажатии, вам необходимо сообщить кнопке, что при нажатии на нее необходимо активировать функцию. Это делается с помощью clicked.connect (), где активируемая функция передается в качестве аргумента. В моем случае это:
self . button1 . clicked . connect ( self . button_clicked )Затем мы определяем функцию, которая будет вызываться или активироваться при нажатии кнопки. А пока просто распечатаем его на консоли.
def button_clicked ( self ) :
url_value = self . input_bar . text ( )print ( url_value )
Теперь код в целом будет выглядеть так:
ШАГ 4: СОЗДАНИЕ ЯРЛЫКОВ
Теперь давайте изменим команду нажатия кнопки с помощью QLabels. QLabels используются для добавления текста. Мы добавляем это в def initUI (self).
Устанавливаем текст на этикетке с помощью метода setText ().
Мы устанавливаем шрифт, размер и вес с помощью setStyleSheet (). Мы устанавливаем шрифт, размер и вес с помощью setStyleSheet ().
И, наконец, обновляем все с помощью метода update ().
Это создает следующее:
Теперь мы можем изменить содержимое в функции button_clicked ().
Мы можем получить то, что пользователь пишет в текстовой строке, используя метод text ().
Затем мы можем изменить метку при нажатии кнопки с помощью метода setText () и разместить их в нужном месте с помощью метода setGeometry ().
self . label . setText ( url_value )
self . label . setGeometry ( QtCore. QRect ( 200 , 80 , 500 , 100 ) )
Теперь код в целом будет выглядеть так:
ШАГ 5: QVBOXLAYOUT И QHBOXLAYOUT
Я не не т добавлять к QVBoxLayout или QHBoxLayout здесь, но вы можете, если вы хотите. QHBoxLayout расположит все по горизонтали, а QVBoxLayout расположит по вертикали. Если вы используете QHBoxLayout или QVBoxLayout, вы должны опустить метод setGeometry ().
Если бы вы хотели добавить его, вы бы написали следующее в def initUI (self). Сначала вы инициализируете макет с помощью QVBoxLayout ():
Затем вы добавляете в него нужные виджеты с помощью метода addWidget ().
self . design . addWidget ( self . label )
self . design . addWidget ( self . input_bar )
self . design . addWidget ( self . button1 )
Вы устанавливаете макет с помощью setLayout (), который принимает инициализированную переменную в качестве аргумента.
Мне это здесь не нужно, потому что я все настраиваю с помощью setGeometry (), поэтому я опущу это в своем коде. Однако, если вы хотите, чтобы это было в вашем коде, весь код будет выглядеть так:
ШАГ 6: ДИЗАЙНЕР QT
Что еще лучше с PyQt5, так это то, что он поставляется со своим собственным дизайнером. Дизайнер — это консоль, на которой вы можете создать желаемый графический интерфейс, а программа выбрасывает для него код Python. Qt Designer поставляется в пакете pyqt5-tools, поэтому его необходимо установить, чтобы он работал. В конструкторе Qt вы можете размещать кнопки, ползунки и т.д. После того, как вы разместите их, вы можете сохранить файл как файл.ui.
После того, как файл сохранен как файл.ui, вам все равно нужно преобразовать его в файл.py, чтобы PyCharm мог его отобразить. Для этого откройте терминал или cmd и введите:
Я сохранил свой файл как saved_file_name.ui. Терминал выдаст файл python и назовет его так, как вы просили. Затем вы можете открыть файл.py в PyCharm и добавить к нему логику.
Помните, что, хотя мы можем использовать конструктор для разработки макета графического интерфейса пользователя, нам все же необходимо добавить логику в код, что делается исключительно с помощью кода Python, а не дизайнера. К сожалению, Qt Designer не добавляет логики в код!
В этом руководстве мы узнали об основах PyQt5 и о том, как использовать конструктор Qt. Мы узнали, что можем создавать пустые экраны, добавлять кнопки с помощью QPushButton, добавлять панели ввода с помощью QLineEdit, добавлять текст с помощью QLabels и упорядочивать все с помощью QVBoxLayout / QHBoxLayout. Фактически, PyQt5 — это очень большой модуль, используемый для создания множества настольных приложений с графическим интерфейсом пользователя. Хотя в python есть много модулей для приложений с графическим интерфейсом, большинство людей выбирают PyQt5, потому что он предлагает огромный выбор дизайнов и дизайнера для облегчения задач. Действительно, PyQt5 стоит изучить!
Читайте также: