Как сделать сохранение файла в pyqt5

Добавил пользователь Евгений Кузнецов
Обновлено: 05.10.2024

Я пишу простое графическое приложение для карточек. Пользователь генерирует флэш-карты, и они сохраняются в список. Я хочу сохранить только список в файл, чтобы пользователь мог иметь несколько колод и просто Файл-> открыть, что они хотят. В моем необразованном мозгу я чувствую, что сохранение их в файле Python сделает весь процесс проще, если предположить, что я сделал что-то вроде следующего при загрузке:

Я пытался использовать оба

без удачи Так что теперь у меня есть два основных вопроса. 1) это самый эффективный способ сделать это и 2) если да, то чего мне не хватает, потому что даже когда я сохраняю после добавления расширения.py вручную, он все равно сохраняется как текстовый файл?

для справки вот моя функция сохранения

который я вызываю в главном окне через действие меню.

Вот весь сценарий

cards - это скрипт, который я использовал только для написания класса для объекта card. это просто:

На этом уроке мы рассмотрим работу с файлами и каталогами в 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

PyQt — это связывание Python с открытым исходным кодом виджета-инструментария Qt, который также функционирует как кроссплатформенная среда разработки приложений. Qt является популярной средой C ++ для написания приложений с графическим интерфейсом для всех основных настольных, мобильных и встраиваемых платформ (поддерживает Linux, Windows, MacOS, Android, iOS, Raspberry Pi и другие).

PyQt — это бесплатное программное обеспечение, разработанное и поддерживаемое Riverbank Computing, компанией, базирующейся в Англии, тогда как Qt разрабатывается финской фирмой The Qt Company.

В этом уроке по PyQT вы узнаете:

Особенности PyQT

Вот Важные особенности PyQt:

PyQt состоит из более чем шести сотен классов, охватывающих ряд функций, таких как

  • Графический интерфейс пользователя
  • Базы данных SQL
  • Веб-инструментарий
  • Обработка XML
  • сетей

Эти функции можно комбинировать для создания расширенных пользовательских интерфейсов, а также автономных приложений. Многие крупные компании во всех отраслях используют Qt. Вот некоторые примеры: LG, Mercedes, AMD, Panasonic, Harman и т. Д.

Версии PyQt

PyQt доступен в двух редакциях: PyQt4 и PyQt5. PyQt4 предоставляет связующий код для привязки версий Qx 4.x и 5.x, в то время как PyQt5 обеспечивает привязку только для версий 5.x. В результате PyQt5 не имеет обратной совместимости с устаревшими модулями более старой версии. В этом уроке PyQt5 будет использоваться для демонстрации примеров. Помимо этих двух версий,

Riverbank Computing также предоставляет PyQt3D — привязки python для инфраструктуры Qt3D. Qt3D — это прикладная среда, используемая для создания систем моделирования в реальном времени с 2D / 3D рендерингом.

Как установить PyQt

Есть два способа установки PyQt.

  • Использование колесных файлов
  • Сборка и установка из исходного кода

Установка с колесами

Колеса — это новый стандартный формат упаковки и распространения Python. Проще говоря, колесо — это ZIP-архив со специальным названием и. расширение файла. Колеса могут быть установлены с помощью pip (менеджер пакетов Python), который включен по умолчанию в последние версии Python.

Чтобы установить PyQt5,

Шаг 1) Откройте командную строку или PowerShell на вашем компьютере с Windows.


Шаг 2) Введите следующее

Этот шаг загрузит пакет PyQt5 whl (около 50 МБ) и установит его в вашей системе.


Шаг 1) Кроме того, вы также можете загрузить двоичный файл Windows для версии Python, установленной на вашем компьютере.

После завершения перейдите к следующему разделу, чтобы написать свое первое приложение с графическим интерфейсом.

Основные концепции и программы PyQt

Теперь, когда вы успешно установили PyQt5 на свой компьютер, вы готовы писать приложения с графическим интерфейсом на python.

Давайте начнем с простого приложения, которое будет отображать пустое окно на вашем экране.

Запустите свой Python IDLE и введите следующее:

Сохраните его как app.py (имя не имеет значения) и нажмите F5, чтобы запустить программу. Кроме того, просто дважды щелкните сохраненный файл, чтобы запустить приложение. Если вы все сделали правильно, откроется новое окно с заголовком Guru99, как показано ниже.


Большой! Работает. Это немного, но этого достаточно, чтобы понять основы. Теперь давайте посмотрим подробно, что делает каждая из строк в вашей программе.

Этот оператор импортирует все модули, необходимые для создания GUI, в текущее пространство имен. Модуль QtWidgets содержит все основные виджеты, которые вы будете использовать в этом руководстве.

Здесь вы создаете объект класса QApplication. Этот шаг необходим для PyQt5; каждое приложение пользовательского интерфейса должно создавать экземпляр QApplication в качестве своего рода точки входа в приложение. Если вы не создадите его, ошибки будут показаны.

sys.argv — это список параметров командной строки, которые вы можете передать приложению при запуске через оболочку или при автоматизации интерфейса.

В этом примере вы не передали аргументы QApplications. Следовательно, вы также можете заменить его приведенным ниже кодом и даже не импортировать модуль sys.

Далее мы создаем объект класса QWidget. QWidget — это базовый класс всех объектов пользовательского интерфейса в Qt, и практически все, что вы видите в приложении, является виджетом. Это включает в себя диалоги, тексты, кнопки, панели и так далее. Функция, которая позволяет создавать сложные пользовательские интерфейсы, заключается в том, что виджеты могут быть вложенными, то есть вы можете иметь виджет внутри виджета, который находится внутри еще одного виджета. Вы увидите это в действии в следующем разделе.

Метод resize класса QWidget позволяет вам устанавливать размеры любого виджета. В этом случае вы изменили размер окна до 300 на 300 пикселей.

Здесь вы должны помнить, что виджеты могут быть вложены вместе, самый внешний виджет (т. Е. Виджет без родителя) называется окном.

Метод setWindowTitle () позволяет вам передать строку в качестве аргумента, который установит заголовок окна переданной вами строке. В этом примере в строке заголовка будет отображаться Guru99.

show () просто отображает виджет на экране монитора.

Метод app.exec_ () запускает цикл событий Qt / C ++. Как вы знаете, PyQt в основном написан на C ++ и использует механизм цикла событий для реализации параллельного выполнения. app.exec_ () передает управление Qt, который будет выходить из приложения только тогда, когда пользователь закроет его из графического интерфейса. Вот почему Ctrl + C не будет выходить из приложения, как в других программах Python. Поскольку Qt контролирует приложение, события Python не обрабатываются, пока мы не настроим их внутри приложения. Также обратите внимание, что у метода exec есть подчеркивание в его имени; это потому, что exec () уже был ключевым словом в python, а подчеркивание разрешает конфликт имен.

В предыдущем разделе вы видели, как создать базовый виджет в Qt. Пришло время сделать несколько более сложных интерфейсов, с которыми пользователи могут по-настоящему взаимодействовать. Снова, запустите ваш IDLE и напишите следующее.

Сохраните файл как appone.py или как угодно и нажмите F5, чтобы запустить программу. Если вы не допустили ошибок, IDLE откроет новое окно с текстом и кнопкой, как показано ниже.


Теперь, когда он работает, давайте взглянем на дополнительный код, который вы добавили в предыдущий пример.

Это импортирует еще несколько виджетов, которые вы использовали в этом примере, а именно QLabel, QPushButton и QMessageBox.

Метод диалога вызывается из основного блока программы при нажатии кнопки в определенном виджете (в данном случае, btn PushButton). Событие щелчка, вызванное этой кнопкой, вызывает выполнение этой функции. Такая функция называется слотом в Qt, и вы узнаете больше о сигналах и слотах в следующих параграфах.

Это основной раздел приложения, и, как и в предыдущем примере, вы начинаете с создания экземпляра QApplication, за которым следует простой виджет, то есть экземпляр QWidget.

Вы добавили два новых виджета в это приложение: QLabel и QPushButton. QLabel используется для печати нередактируемого текста или заполнителей внутри виджета, тогда как QPushButton используется для создания нажимаемой кнопки.

Здесь важно отметить, что при создании объектов label и btn вы передаете объект окна (w) конструкторам QLabel и QPushButton. Вот как работает вложение в PyQt5. Чтобы создать виджет внутри другого виджета, вы передаете ссылку на родительский виджет в конструктор дочернего элемента.

move () используется для установки позиции виджета относительно его родительского виджета. В первом случае метка будет перемещена на 100 пикселей слева и на 130 пикселей сверху окна.

Точно так же кнопка будет размещена на 110 пикселей слева и на 150 пикселей сверху окна. Этот пример является грубым способом достижения макетов и обычно не используется в производстве; это включено здесь только в учебных целях. Qt поддерживает различные макеты, которые вы детально увидите в следующих разделах этого руководства.

Наконец, это пример сигналов и слотов в Qt. В приложениях на основе графического интерфейса функции выполняются на основе действий, выполняемых пользователем, таких как наведение на элемент или нажатие кнопки. Эти действия называются событиями . Напомним, что метод app.exec_ () передает управление в цикл обработки событий Qt . Для этого существует цикл событий: прослушивать события и выполнять действия в ответ.

Всякий раз, когда происходит событие, например, когда пользователь нажимает кнопку, соответствующий виджет Qt генерирует сигнал . Эти сигналы могут быть связаны с функциями Python (например, с функцией диалога в этом примере), так что функция выполняется при срабатывании сигнала. Эти функции называются слотами в Qt lingo.

Впоследствии основной синтаксис для запуска функции слота в ответ на сигнал от события выглядит следующим образом

Это означает, что всякий раз, когда сигнал запускается виджетом , будет выполняться функция подключенного слота . Таким образом, Qt использует сигналы и слоты для связи между объектами и облегчения повторного использования и интерактивности компонентов.

Теперь, когда вы знаете, как вкладывать виджеты и реализовывать взаимодействия с помощью сигналов и слотов, вот список полезных виджетов и других классов, которые вы можете использовать в своих приложениях PyQt.

Компоненты и виджеты

В PyQt доступно большое количество виджетов для создания приложений с графическим интерфейсом. Однако с PyQt5 произошла перестановка классов в разные модули и ревизии в лицензиях.

Поэтому очень важно иметь общее представление о структуре PyQt5. В этом разделе вы увидите, как PyQt5 организован внутри, и узнаете о различных модулях, библиотеках и классах API, предоставляемых PyQt5.

Структура каталогов PyQt5


Это фундаментальные модули, используемые связыванием Qt в Python, в частности PyQt5.

  • Qt : Он объединяет все классы / модули, упомянутые ниже, в один модуль. Это значительно увеличивает объем памяти, используемой приложением. Однако управлять инфраструктурой проще, импортируя только один модуль.
  • QtCore : содержит основные неграфические классы, используемые другими модулями. Именно здесь реализуются цикл событий Qt, сигналы, возможность подключения к слотам и т. Д.
  • QtWidgets : содержит большинство виджетов, доступных в Pyqt5.
  • QtGui : содержит компоненты графического интерфейса и расширяет модуль QtCore.
  • QtNetwork : Содержит классы, используемые для реализации сетевого программирования через Qt. Он поддерживает TCP-серверы, TCP-сокеты, UDP-сокеты, обработку SSL, сетевые сеансы и поиск DNS.
  • QtMultimedia предоставляет низкоуровневую мультимедийную функциональность.
  • QtSql : реализует интеграцию базы данных для баз данных SQL. Поддерживает ODBC, MySQL, Oracle, SQLite и PostgreSQL.

PyQt5 Виджеты

Вот список наиболее часто используемых виджетов в PyQt5

  • QLineEdit : это поле ввода, которое позволяет пользователю вводить одну строку текста.
  • QRadioButton : это поле ввода с выбираемой кнопкой, аналогичное переключателям в html.
  • QComboBox : используется для отображения выпадающего меню со списком выбираемых элементов.
  • QCheckBox : отображает выбираемое квадратное поле перед меткой, которая отмечена, если выбрана, аналогично переключателям.
  • QMenuBar : отображает горизонтальную строку меню в верхней части окна. Вы можете добавлять только объекты класса QMenu в эту панель. Эти объекты QMenu могут дополнительно содержать строки, объекты QAction или другие объекты QMenu.
  • QToolBar : это горизонтальная панель или панель, которую можно перемещать в пределах окна. Может содержать кнопки и другие виджеты.
  • QTab : используется для разбиения содержимого окна на несколько страниц, к которым можно получить доступ через разные вкладки в верхней части виджета. Он состоит из двух разделов: панель вкладок и страница вкладок.
  • QScrollBar : используется для создания полос прокрутки, которые позволяют пользователю прокручивать вверх и вниз в пределах окна. Он состоит из подвижного ползунка, дорожки ползунка и двух кнопок для прокрутки ползунка вверх или вниз.
  • QSplitter : Сплиттеры используются для разделения содержимого окна, чтобы виджеты были сгруппированы правильно и не выглядели загроможденными. QSplitter является одним из основных обработчиков макетов, доступных в PyQt5, и используется для разделения содержимого по горизонтали и вертикали.
  • QDock : виджет-док — это подокно с двумя свойствами:
    • Это может быть перемещено в главное окно и
    • Его можно закрепить за пределами родительского окна в другом месте на экране.

    Макеты и Темы

    В предыдущих примерах вы использовали только методы move () и resize () для установки позиций виджетов в вашем графическом интерфейсе.

    Тем не менее, PyQt имеет надежный механизм управления компоновкой, который можно использовать для создания расширенных пользовательских интерфейсов для приложений. В этом разделе вы узнаете о двух важных классах, которые используются в Qt для создания и управления макетами.

    QBoxLayout

    QBoxLayout используется для выравнивания дочерних виджетов макета в горизонтальной или вертикальной строке. Два класса интереса, которые наследуются от QBoxLayout:

    • QHBoxLayout: используется для выравнивания дочерних виджетов по горизонтали.
    • QVBoxLayout: используется для выравнивания дочерних виджетов по вертикали.

    Например, так будут выглядеть три кнопки, выровненные по QHBoxLayout.


    И вот как они будут выглядеть в QVBoxLayout.


    Единственная функция, которая нуждается в каком-либо объяснении на данный момент, это метод addWidget (). Он используется для вставки виджетов в макет HBox или VBox. Он также используется в других макетах, где он принимает другое количество параметров, как вы увидите в следующем разделе. Виджеты появятся внутри макета в том порядке, в котором вы их вставляете.

    QGridLayout

    QGridLayout используется для создания интерфейсов, в которых виджеты расположены в виде сетки (например, матрицы или 2D-массива). Чтобы вставить элементы в сетку, вы можете использовать матричное представление, чтобы определить количество строк и столбцов в сетке, а также положение этих элементов.

    Например, чтобы создать сетку 3 * 3 (то есть сетку с тремя строками и тремя столбцами), вы напишите следующий код:

    Это будет вывод:


    Метод addWidget () В макете сетки принимает следующие аргументы:

    • Объект виджета, который вы хотите добавить в сетку
    • X-координата объекта
    • Y-координата объекта
    • Разряд строки (по умолчанию = 0)
    • Col-span (по умолчанию = 0)

    Чтобы лучше это понять, вы можете вручную вставить каждый виджет, как показано ниже

    Вот как будет выглядеть сетка:


    Вы также можете передать параметры rowspan и colspan в addWidget (), чтобы охватить более одной строки или столбца.

    Это создаст кнопку, которая простирается на оба столбца.


    PyQt5 поставляется с некоторыми встроенными темами, которые вы можете использовать в своих приложениях. Метод setStyle (), вызываемый в экземпляре QApplication, используется для установки определенной темы для вашего приложения.

    Например, добавление следующей строки кода изменит тему вашего приложения по умолчанию на Fusion

    Вот как будет выглядеть предыдущий пример в Fusion Theme


    Еще одна полезная функция для создания тем ваших приложений — это метод setPalette (). Вот код для изменения цвета различных виджетов с помощью setPalette ().


    Чтобы использовать метод setPalette (), сначала необходимо определить палитру. Это делается путем создания объекта класса QPalette.

    Обратите внимание, что класс QPalette принадлежит модулю QtGui, и вам нужно будет импортировать его, чтобы это работало. Создав объект QPalette, используйте метод setColor (), чтобы передать имя виджета, цвет которого вы хотите изменить, и цвет, который вы хотите установить.

    Это изменит цвет окна на черный. После того, как вы определили свою цветовую схему, используйте функцию setPalette (), чтобы применить палитру к вашему приложению.

    Это все, что вам нужно сделать, если вы хотите создать базовые темы для своего приложения. PyQt также позволяет вам использовать таблицы стилей для определения внешнего вида ваших виджетов. Если вы знакомы с CSS, вы можете легко определить расширенные стили для своего приложения, используя таблицы стилей Qt.

    Что такое Qt designer

    Qt Designer – это программа которая упрощает создание графического интерфейса нашей программы, конечно внешний вид можно сделать и без помощи данной программы, но не для всех это будет удобно. В этой статье мы разобрались как установить все необходимое и теперь можем приступить к работе.

    Открываем Qt designer

    Чтобы открыть Qt designer открываем командную строку, вводим в ней designer.exe и жмем Enter. Перед нами откроется следующее окно:


    Здесь нужно выбрать один из пяти предложенных шаблонов:

    Dialog with Buttons Bottom (Диалоговое окно с кнопками внизу) – форма с кнопками ОК и Cancel расположенными внизу.

    Dialog with Buttons Right (Диалоговое окно с кнопками справа) – такая же как и предыдущая форма, но кнопки расположены вверху справа.

    Dialog without Buttons (Диалоговое окно без кнопок) – пустая форма диалогового окна.

    Main Window (Главное окно) – окно с пустым меню и панелью для инструментов.

    Widget (Виджет) – пустое окно.

    Создаем первую программу в Qt designer

    Сделаем простую программку на основе Main Window, для этого выбираем шаблон и нажимаем кнопку Create (Создать).


    Из бокса слева с помощью ЛКМ (левой клавиши мыши) перетаскиваем виджет Label (используется для отображения текста или рисунка) в центральное окно (это и есть окно нашей программы) теперь рассмотрим правую часть окна Qt designer:


    Далее расположен Property Editor в нем располагаются свойства выбранного витжета, так если выбрать наш Label, он будет выглядеть следующим образом:


    Рассмотрим пока некоторые из пунктов:

    objectName – определяет имя виджета (то как он будет отображаться в коде программы) по умолчанию стоит label (если добавим второй такой же виджет он будет называться label_2 и так далее);

    В пункте geometry – задаются размеры виджета;

    В пункте font – задается каким шрифтом, размером и типом будет выполнена надпись;

    Далее прокручиваем вниз там находится Qlabel:

    Пункт text – определяет что будет написано в нашем виджете;

    Пункт alignment – определяет выравнивание текста.

    Закончив настройку внешнего вида программы (а мы пока закончим на добавлении одного элемента label) сохраняем наш файл как label.ui (или под другим удобным для вас именем). После чего программу Qt designer можно закрыть, пока она нам больше не пригодится.

    Использование графического интерфейса в Python

    1. Загрузка файла .ui в код Python;
    2. Конвертиртация файла .ui в файл .py при помощи pyuic5

    Я бы советовал использовать второй способ, так как он несколько быстрее в обработке и не требует у машины конвертации в реальном времени.

    Связывание файла .UI с python

    Чтобы выполнить загрузку файла в наш код создадим новый документ Python и используем в нем функцию загрузки loadUI():


    Если запустить этот код (если Вы используете Sublime Text 3 то это делается комбинацией клавиш Ctrl + B) откроется окно наше программы, это значит что все работает.

    Конвертация файла .ui в файл .py

    Конвертация создает файл .ру который уже связывается с файлом в котором будет располагаться код самой программы. Открываем командную строку и вводим CMD, в открывшемся окне прописываем сначала cd далее путь к папке, где расположен наш файл .ui и жмем Enter

    Далее вводим команду pyuic5 label.ui -o label.py — где label.ui – это имя нашего файла созданного в Qt designer а label.py имя нашего нового файла который будет создан при конвертации и жмем Enter.

    Далее закрываем окно консоли и видим что у нас появился новый файл label.py. теперь создаем новый файл python где пишем следующий код:

    Читайте также: