Проблема повторного нажатия кнопки
Повторное нажатие кнопки «равно» приводит к ошибке: в текстовом поле находится строка, а не математическое выражение. Программа завершается с ошибкой, выведенной в консоль. Решение: использование всплывающих окон для информирования пользователя.
Предотвращение ошибки
Для предотвращения повторного выполнения кода при повторном нажатии кнопки «равно» используется переменная is_equal. Если is_equal – False, код выполняется, и is_equal устанавливается в True. При повторном нажатии is_equal будет True, код, вызывающий ошибку, пропускается, отображается всплывающее окно.
Всплывающее окно: создание и настройка
Импортируем класс QMessageBox из PyQt5.QtWidgets:
from PyQt5.QtWidgets import QMessageBox
Создаем объект error:
error = QMessageBox()
Отображение окна: error.exec_(). Перед отображением заполним его информацией:
error.setWindowTitle("Ошибка")
error.setText("Сейчас это действие выполнить нельзя")
error.setIcon(QMessageBox.Warning)
Возможны другие иконки: QMessageBox.Information, QMessageBox.Critical и другие.
Добавим кнопки «OK» и «Отмена» с помощью setStandardButtons():
error.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
Кнопки разделяются символом |. Установим кнопку «OK» по умолчанию:
error.setDefaultButton(QMessageBox.Ok)
Добавим дополнительный текст:
error.setInformativeText("Два раза действия не выполнить")
error.setDetailedText("Полная информация об ошибке")
Обработка нажатия кнопок
Обработка нажатия кнопок через сигнал buttonClicked:
error.buttonClicked.connect(popup_action)
Функция popup_action принимает нажатую кнопку как параметр:
def popup_action(button):
if button.text() == "OK":
print("OK")
elif button.text() == "Reset":
label_result.setText("")
is_equal = False
При нажатии «Reset» очищается текстовое поле, is_equal сбрасывается.
QMessageBox позволяет создавать удобные всплывающие окна, эффективно обрабатывая ошибки и предоставляя дополнительную информацию. В уроке рассмотрены основные методы настройки и использования всплывающих окон в PyQt.