Как сделать так чтобы pyqt5 не замалчивал ошибки

Добавил пользователь Алексей Ф.
Обновлено: 05.10.2024

У меня нет никаких ошибок при запуске приложения, только получая эти ошибки при попытке сгенерировать .exe с помощью pyinstaller. Почему?

Обратите внимание также, что Anaconda3 всплывает в traceback выше (почему он ищет там двоичные файлы?), но I:

  • Удаленный pyinstaller из Anaconda
  • Я использую стандартный компилятор Python 3.5 (64-разрядный)

Единственное, что я могу думать о том, что может быть виновником, – это то, что я больше не использую версию разработчика Pyinstaller (она просто не работает в Python 3.5). Мне пришлось использовать версию разработчика для решения моей проблемы с замораживанием здесь, когда мой код был написан для python 2.7

Удалите Anaconda, и все работает… Я пришел к выводу, что вы просто не можете установить Anaconda и использовать стандартный компилятор Python 3.5 в то же время, если используете Pyinstaller. Возможно, это.

Это не первый, когда удаление Anaconda, похоже, решит мои проблемы… Если я должен сообщить об этой проблеме, пожалуйста, прокомментируйте ниже. Я не знаю, где.

Мне удалось решить ту же проблему, с которой я столкнулся (conda 4.5.4, pyinstaller 3.4) без удаления conda:

conda уже установил PyQt, когда я использовал conda install jupyter seaborn . Интересно, что использование conda install PyQt5 не устраняет мою проблему. Я не знаю почему. В любом случае я надеюсь, что это может помочь кому-то там.

Я думаю, что есть проблема с текущей версией pyinstaller. Я удалил версию по умолчанию.

pip uninstall pyinstaller

и установил последнюю пробную версию

и тогда это сработало для меня.

[специально для установки анакодны] У меня была такая же проблема, но она была исправлена, когда я обновил анаконду. Из подсказки Анаконды: conda update anaconda . Это обновляет несколько пакетов, включая pyqt

Решение состоит в том, чтобы добавить --exclude-module PyQt5 после оператора pyinstaller.

То, что сработало для меня (пока я пытаюсь конвертировать в .exe скрипт с именем main.py), это вариант kierabeth. Более конкретно следующее:

сначала создайте файл спецификации и исключите модуль PyQt5

затем создайте файл спецификации

Это по-прежнему похоже на проблему, поэтому я воскрешаю эту старую публикацию на тот случай, если кто-то вроде меня найдет решение той же проблемы.

Вам не нужно ничего удалять или переустанавливать. Я только что установил последнюю версию Anaconda и pyinstaller и снова столкнулся с той же ошибкой.

Проблема заключается в файле.. /Anaconda3\Lib\site-packages\PyInstaller\utils\hooks\qt.py.

Я надеюсь, что разработчики pyinstaller исправят это на каком-то этапе.

У меня такая же проблема. я устанавливаю pyqt5 с pip и закрываю анаконду. тогда это работает.

Я пытаюсь запустить скрипт Python, используя PyQt5 QtWebEngineWidgets, но он выдает ошибки:

Я думаю, что отсутствует пакет, но какой? python3-pyqt5.qtwebkit установлено.

Как заставить это работать?

Это приводит к множеству зависимостей, в том числе libqt5webenginecore5 , libqt5webenginewidgets5 , python3-pyqt5.qtwebchannel а также python3-pyqt5.qtwebengine ,

Я не знаю, как это связано с тем, что ответ компилятора на QtWebEngine не был упакован для Ubuntu, но он работал для меня без компиляции Qt/PyQt.

Я установил python3-pyqt5.qtmultimedia

в ксениале (потому что python3-pyqt5.qtwebengine не был найден, поэтому я искал все подходящие шаблоны python3-pyqt5 а также apt-cache search нашел этот среди других, которые мне показались актуальными.

Теперь я могу использовать ffmpegconverter снова! (Маленький, который делает великие дела, который я собрал вручную).

Скрипту нужен QtWebEngine, а не QtWebKit.

К сожалению, это не упаковано для Debian / Ubuntu, поэтому единственный способ запустить его - это скомпилировать Qt и PyQt самостоятельно (что может быть немного неприятно).

Если вы попали сюда и используете pip - я не исследовал полностью, но я получил именно это при запуске Anki с момента обновления в pip до PyQT5 5.12. Размеры пакетов для 5.11.3 и 5.12 сильно различаются - 5.11.3 весит 118 МБ, а 5.12 - только 61 МБ. Принудительная установка 5.11.3 устранила проблему. Я предполагаю, что это больше не входит в PyQT5 в pip, и должно быть установлено как отдельное требование.

Именно в примечаниях к выпуску они переместили веб-виджеты в другой пакет. Просто беги:

Если вы попали сюда и используете pip - я не исследовал полностью, но я получил именно это при запуске Anki с момента обновления в pip до PyQT5 5.12. Размеры пакетов для 5.11.3 и 5.12 сильно различаются - 5.11.3 весит 118 МБ, а 5.12 - только 61 МБ. Принудительная установка 5.11.3 устранила проблему. Я предполагаю, что это больше не входит в PyQT5 в pip, и должно быть установлено как отдельное требование.

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

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

В этом руководстве по PyQT мы рассмотрим:


Получите курс и узнайте, как создать программу для перевода текстов на Python

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

Основные понятия и программы PyQt

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

Функци PyQT

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

Графические пользовательские интерфейсы

Базы данных SQL

Эти функции можно комбинировать для создания расширенных пользовательских интерфейсов, а также автономных приложений. Многие крупные компании из различных отраслей используют PyQt: 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.

Использование файлов Wheel

Сборка и установка из исходного кода

Установка с помощью Wheel

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

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

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


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

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


Кроме того, вы также можете загрузить двоичный файл 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 откроет новое окно с текстом и кнопкой, как показано ниже.


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

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

Метод dialog вызывается из основного блока программы, когда кнопка нажимается в определенном виджете (в данном случае, 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



Получите курс и узнайте, как создать программу для перевода текстов на Python

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

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 и QGridLayout.

QBoxLayout

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

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

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

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


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


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

QGridLayout

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

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

Вывод будет следующий:


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

Объект виджета, который вы хотите добавить в сетку

Диапазон строк (по умолчанию = 0)

Col-span (по умолчанию = 0)

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

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


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

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


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

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


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


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

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

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

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

Заключение

PyQt — это привязка Python для инфраструктуры пользовательского интерфейса C ++, Qt.

PyQt4 и PyQt5 — две основные версии, разработанные Riverbank Computing.

Основными модулями платформы PyQt являются: Qt, QtCore, QtWidgets, QtGui, QtSql, QtNetwork

PyQt поддерживает различные виджеты, такие как: Кнопки, Текстовые метки, Текстовые поля, Переключатели и чек-боксы, Панели инструментов и строки меню, Webkit, Вкладки, Доки

В PyQt интерактивность реализована с использованием сигналов и слотов.

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

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

Слот является функцией, которая подключается к сигналу и выполняет при повышении сигнала.

PyQt имеет надежный механизм компоновки и поддерживает расширенный дизайн макета и управление им. Это две часто используемые схемы компоновки в PyQt: Макет блока, Макет сетки

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

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

Редакция: Команда webformyself.


Получите курс и узнайте, как создать программу для перевода текстов на Python

Я пытаюсь запустить скрипт Python, используя PyQt5 QtWebEngineWidgets, но он выдает ошибки:

Я думаю, что отсутствует пакет, но какой именно? python3-pyqt5.qtwebkit установлен.

Как заставить это работать?

Для сценария нужен QtWebEngine, не QtWebKit.

, К сожалению, это не упаковано для Debian/Ubuntu, таким образом, единственный способ, которым Вы получили бы то выполнение, состоит в том, чтобы скомпилировать QT и PyQt самостоятельно (который может быть чем-то вроде боли).

I' d нравится знать, почему транзакция является разрушительной. Так, чтобы я мог препятствовать тому, чтобы он стал разрушительным снова. I' d также любят говорить systemd пихать его. – Bokkie 26 September 2017 в 01:53

Это вводит загрузки зависимостей, включая libqt5webenginecore5 , libqt5webenginewidgets5 , python3-pyqt5.qtwebchannel и python3-pyqt5.qtwebengine .

я не знаю, как это касается ответа @The Компилятора QtWebEngine, не упаковываемый для Ubuntu, но это работало на меня без любой компиляции Qt/PyQt.

Если Вы добираетесь здесь и используете зернышко - я не занялся расследованиями полностью, но я просто получил просто это при выполнении Anki начиная с обновления в зернышке к PyQT5 5.12. Размеры пакета для 5.11.3 и 5.12 весьма отличаются - 5.11.3, взвешивается в 118 МБ и 5.12 на уровне "только" 61 МБ. Принуждение установки 5.11.3 удалило проблему. Я предполагаю, что это больше не связывается в PyQT5 в зернышке и должно быть установлено как отдельное требование.

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