Assuming you are in a QWidget from which you want to display an error message, you can simply use QMessageBox.critical(self, "Title", "Message"), replace self by another (main widget for example) if you are not is a QWidget class.
Edit: even if you are not in a QWidget (or don’t want to inherit from it), you can just use None as parent with for instance QMessageBox.critical(None, "Title", "Message").
Edit, here is an example of how to use it:
# -*-coding:utf-8 -*
from PyQt5.QtWidgets import QApplication, QMessageBox
import sys
# In this example, success is False by default, and
# - If you press Cancel, it will ends with False,
# - If you press Retry until i = 3, it will end with True
expectedVal = 3
def MyFunction(val: int) -> bool:
return val == expectedVal
app = QApplication(sys.argv)
i = 1
success = MyFunction(i)
while not success:
# Popup with several buttons, manage below depending on choice
choice = QMessageBox.critical(None,
"Error",
"i ({}) is not expected val ({})".format(i, expectedVal),
QMessageBox.Retry | QMessageBox.Cancel)
if choice == QMessageBox.Retry:
i += 1
print("Retry with i = {}".format(i))
success = MyFunction(i)
else:
print("Cancel")
break
if success:
# Standard popup with only OK button
QMessageBox.information(None, "Result", "Success is {}".format(success))
else:
# Standard popup with only OK button
QMessageBox.critical(None, "Result", "Success is {}".format(success))
Вы должны использовать excepthook,
и если вы хотите, чтобы событие завершилось, вы должны вызвать метод quit().
import sys
import traceback
from PyQt5 import QtWidgets, QtGui, QtCore
class ErrorApp(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
bar = self.menuBar()
menu = bar.addMenu('&Menu')
action_raise = QtWidgets.QAction("Raise", self)
action_exit = QtWidgets.QAction("Exit", self)
menu.addAction(action_raise)
menu.addAction(action_exit)
action_exit.triggered.connect(self.quit_trigger)
action_raise.triggered.connect(self.raise_error)
def raise_error(self):
aa = 5 / 0 # какая-то ошибка
def quit_trigger(self):
QtWidgets.qApp.quit()
def excepthook(exc_type, exc_value, exc_tb):
tb = "".join(traceback.format_exception(exc_type, exc_value, exc_tb))
print("Oбнаружена ошибка !:", tb)
# QtWidgets.QApplication.quit() # !!! если вы хотите, чтобы событие завершилось
sys.excepthook = excepthook
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = ErrorApp()
w.show()
sys.exit(app.exec_())
@Meller008
Если я правильно понял вопрос, то например
if error:
QMessageBox.critical(self, "Ошибка ", "Выделите элемент который хотите изменить", QMessageBox.Ok)
Ответ написан
более трёх лет назад
Комментировать
Комментировать
Уведомления
- Начало
- » Python для новичков
- » Вывод ошибки от PyQt5 в консоль
#1 Авг. 1, 2017 09:41:14
Вывод ошибки от PyQt5 в консоль
При использовании PyQt5, например при нажатии кнопки к которой привязана функция, если что-либо в ней (функции) идет не так — программа “падает” и ничего не выдается об ошибке в консоль IDE (в моем случае PyCharm), возможно кто знает, как это исправить?
upd (решение):
https://stackoverflow.com/questions/34363552/python-process-finished-with-exit-code-1-when-using-pycharm-and-pyqt5
# Back up the reference to the exceptionhook sys._excepthook = sys.excepthook def my_exception_hook(exctype, value, traceback): # Print the error and traceback print(exctype, value, traceback) # Call the normal Exception hook after sys._excepthook(exctype, value, traceback) sys.exit(1) # Set the exception hook to our wrapping function sys.excepthook = my_exception_hook
try: sys.exit(app.exec_()) except: print("Exiting")
Отредактировано gmaksim (Авг. 1, 2017 12:37:16)
Офлайн
- Пожаловаться
#2 Авг. 1, 2017 10:24:29
Вывод ошибки от PyQt5 в консоль
Трудно представить, как можно неправильно запустить программу в пайшарме, но кажется, вам это удалось
Офлайн
- Пожаловаться
#3 Авг. 1, 2017 10:25:54
Вывод ошибки от PyQt5 в консоль
Хотя, может быть просто не туда глядите
Офлайн
- Пожаловаться
#4 Авг. 1, 2017 10:39:43
Вывод ошибки от PyQt5 в консоль
Да как бы не так.
print в функциях работают и выдают информацию (“навесил” для теста). Пример работы консоли и “падения” программы в приложении.
По коду — вызывается класс, в классе идут методы один за другим, в них вызывается GUI другими методами с разными параметрами. Есть метод для сохранения данных в БД, вот там и падает, и это точно какая-то особенность использования в качестве GUI — PyQt5 — так как при использовании tkinter — условно при нажатии кнопки запуска функции сохранения в БД в консоль выводило ошибку, почему она не срабатывала, тут же просто “падает”.
Отредактировано gmaksim (Авг. 1, 2017 10:43:56)
Прикреплённый файлы: 
Офлайн
- Пожаловаться
#5 Авг. 1, 2017 10:47:32
Вывод ошибки от PyQt5 в консоль
gmaksim
При использовании PyQt5, например при нажатии кнопки к которой привязана функция, если что-либо в ней (функции) идет не так — программа “падает” и ничего не выдается об ошибке в консоль IDE (в моем случае PyCharm), возможно кто знает, как это исправить?
Онлайн
есть такое и именно в PyQt5. это особенность сборки походу, в С++ такое бывает при сегфолте или нуль-пойнтере. можно из терминала запускать типа python -v my_script
Офлайн
- Пожаловаться
#6 Авг. 1, 2017 10:57:29
Вывод ошибки от PyQt5 в консоль
gmaksim
Ну блин, вы так вопрос задаете “ничего не выдается об ошибке в консоль IDE” как будто у вас нет сообщения об ошибке именно в терминале пайшарма, а другом терминале — все нормально.
PyQt — это набор питоньих обвязок над бинарниками Qt, если что-то “падает” при выполнении этого бинарного кода мы никогда не получим питоньего трейсбэка. Просто, примите это как должное.
Офлайн
- Пожаловаться
#7 Авг. 1, 2017 11:17:21
Вывод ошибки от PyQt5 в консоль
vic57
есть такое и именно в PyQt5. это особенность сборки походу, в С++ такое бывает при сегфолте или нуль-пойнтере. можно из терминала запускать типа python -v my_script
Получилось, только теперь падает на строчке:
conn = sqlite3.connect(‘DATA//db.sqlite’)
sqlite3.OperationalError: unable to open database file
Наверно надо поменять на абсолютный путь?
FishHook
PyQt — это набор питоньих обвязок над бинарниками Qt, если что-то “падает” при выполнении этого бинарного кода мы никогда не получим питоньего трейсбэка. Просто, примите это как должное.
Как-то так и думал, но надеялся, что может есть пути обхода.
python -v my_script похоже на то.
Отредактировано gmaksim (Авг. 1, 2017 11:17:55)
Офлайн
- Пожаловаться
#8 Авг. 1, 2017 11:20:42
Вывод ошибки от PyQt5 в консоль
gmaksim
sqlite3.OperationalError: unable to open database file
это уже не Qt ошибка
Офлайн
- Пожаловаться
#9 Авг. 1, 2017 11:36:42
Вывод ошибки от PyQt5 в консоль
vic57
это уже не Qt ошибка
Угу, я и не имел ввиду, что это Qt ошибка, разобрался, действительно все выводит. Еще раз спасибо.
FishHook
Однако ‘python -v my_script’ (из терминала) все отлавливает (перед “падением”).
Отредактировано gmaksim (Авг. 1, 2017 11:37:10)
Офлайн
- Пожаловаться
#10 Авг. 1, 2017 11:41:23
Вывод ошибки от PyQt5 в консоль
gmaksim
действительно все отлавливает
Что “всё”? Вы же понимаете, что невозможно показать построчный вывод ошибки в скомпилированной сишной библиотеке. Ваша ошибка возникает явно в питоньем коде, поэтому она и отлавливается.
Офлайн
- Пожаловаться
- Начало
- » Python для новичков
- » Вывод ошибки от PyQt5 в консоль
|
0 / 0 / 1 Регистрация: 03.02.2015 Сообщений: 81 |
|
|
1 |
|
|
12.05.2017, 03:58. Показов 6682. Ответов 10
PyQt5 при возникновении ошибки просто завершает работу программы, а хотелось бы посмотреть что ему не понравилось…
0 |
|
2740 / 2339 / 620 Регистрация: 19.03.2012 Сообщений: 8,830 |
|
|
12.05.2017, 05:19 |
2 |
|
Глобальный перехватчик делаешь в месте запуска программы и в обработчике показываешь ошибку возникшую, а потом закрываешь прогу.
0 |
|
kak_ivan 0 / 0 / 1 Регистрация: 03.02.2015 Сообщений: 81 |
||||
|
13.05.2017, 02:17 [ТС] |
3 |
|||
|
Глобальный перехватчик делаешь в месте запуска программы Если так, то не работает(
0 |
|
2740 / 2339 / 620 Регистрация: 19.03.2012 Сообщений: 8,830 |
|
|
13.05.2017, 10:12 |
4 |
|
kak_ivan, так ты тут и не делаешь отображения ошибки. Ты ее поймал и опять кинул дальше.
0 |
|
kak_ivan 0 / 0 / 1 Регистрация: 03.02.2015 Сообщений: 81 |
||||
|
13.05.2017, 21:58 [ТС] |
5 |
|||
|
так ты тут и не делаешь отображения ошибки. http://pep8.ru/doc/tutorial-2.6/9.html Оператор raise позволяет программисту принудительно породить исключение. Например:
Я принудительно порождаю исключение которое отловил try:except: И скорее всего просто где-то нужно передать какой-то параметр в модуль, чтобы он возвращал исключения
0 |
|
2740 / 2339 / 620 Регистрация: 19.03.2012 Сообщений: 8,830 |
|
|
14.05.2017, 18:21 |
6 |
|
kak_ivan, raise возбуждает ошибку, с этим ни кто не спорит, но то, что ты делаешь называется дичь. Ты отлавливаешь ошибку и потом опять ее кидаешь дальше (причем кидаешь не правильно, нужно писать просто raise если хочешь кинуть ошибку дальше). То есть ты написал бесполезный обработчик ошибки, который НИКАК не влияет на ход исполнения программы. Если хочешь увидеть ошибку в гуи, то создай message box и туда пиши ошибку.
0 |
|
0 / 0 / 1 Регистрация: 03.02.2015 Сообщений: 81 |
|
|
15.05.2017, 03:41 [ТС] |
7 |
|
Если хочешь увидеть ошибку в гуи, то создай message box и туда пиши ошибку. Ну хоть что-то полезное сказал, спасибо)
0 |
|
2740 / 2339 / 620 Регистрация: 19.03.2012 Сообщений: 8,830 |
|
|
15.05.2017, 05:56 |
8 |
|
kak_ivan, я это сказал тебе ещё в самом начале. Если было непонятно как вывести ошибку, надо было это переспросить и все.
0 |
|
0 / 0 / 1 Регистрация: 03.02.2015 Сообщений: 81 |
|
|
15.05.2017, 07:35 [ТС] |
9 |
|
Если было непонятно как вывести ошибку, надо было это переспросить
0 |
|
alex925 2740 / 2339 / 620 Регистрация: 19.03.2012 Сообщений: 8,830 |
||||
|
15.05.2017, 20:18 |
10 |
|||
|
красивый способ
2 |
|
kak_ivan 0 / 0 / 1 Регистрация: 03.02.2015 Сообщений: 81 |
||||
|
16.05.2017, 06:56 [ТС] |
11 |
|||
|
def error(self): Очень благодарен) И как ее перехватить?
0 |




)
