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

PyQt - это мощный кроссплатформенный фреймворк, который можно использовать для разработки графического интерфейса. Он является оболочкой популярного QT C++ фреймворка и позволяет подключаться через Python. В этой статье мы будем создавать настольное приложение с использованием Python.

Примечание: я не собираюсь использовать Q tDesigner. Я использую vim для кодирования. Я отказываюсь от усилий, связанных с установкой и изучением IDE.

Установка

Создадим и активируем виртуальную среду

$ virtualenv venv
$ source venv/bin/activate

Установка зависимостей:

$ pip install pyqt5
$ pip install pyinstaller

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

Дизайн

Я буду использовать вот такой дизайн:

  • Калькулятор поддерживает только базовые операции, такие как сложение(+), вычитание(-), умножение(*) и деление(/).
  • Есть два дисплея: один для отображения ввода, а другой - для вывода.
  • Когда пользователь нажимает кнопки, ввод и вывод обновляются автоматически. В операторе equals(=) нет необходимости. Следовательно, он не включен.
  • В случае недопустимого синтаксиса мы будем отображать nan. При делении на 0 мы будем отображать inf.
  • AC вернет калькулятор к состоянию по умолчанию. Также есть опция DEL, которая действует как backspace.

Обратитесь к диаграмме выше, чтобы узнать об основном рабочем процессе, которому мы будем следовать. Начнем с импорта всех компонентов:

  • QtCore содержит базовые классы, которые включают абстракцию для управления компонентами пользовательского интерфейса.
  • QtWidgets содержит компоненты пользовательского интерфейса, которые мы будем использовать, например QLabel, QPushButton, QGridLayout, QWidgets.
  • sys: QApplication принимает список в качестве входных данных. В идеале мы можем отправить пустой список, например:
app = QApplication([])

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

QWidget

Мы начнем с создания базового класса для всех компонентов пользовательского интерфейса. Это базовая структура, с которой мы начинаем.

  • Мы унаследовали QWidget, который будет содержать все наши компоненты пользовательского интерфейса /
  • Мы устанавливаем размеры приложения на высоту 300 и ширину 400. Затем мы устанавливаем заголовок приложения на PyCalculator.
  • Мы инициализируем нашу важную переменную состояния self.data, которая будет использоваться для хранения пользовательского ввода и отображения данных.
  • Мы используем Grid Layout для размещения наших элементов. Чтобы добавить элемент в компоновку сетки, мы будем использовать addWidget(QWidget, row, colum, rowSpan, columnSpan).
  • Ярлыки для отображения входных и выходных данных создаются и добавляются в макет сетки в create_lcd(self). Кнопки для управления приложением создаются и добавляются в макет в create_buttons(self).
  • Затем мы добавляем макет в наш контейнер.

QLabel

Мы используем QLabel для отображения данных. У нас есть два элемента:

  • label_in: показывает введенные данные, то есть нажатые кнопки. Он находится в позиции (0,0) с диапазоном строк 1 и столбцов 4.
  • label_out: показывает выходные данные. Он находится в позиции (1,0) с диапазоном строк 1 и столбцов 4.

AlignRight - заставляет текст прилипать к правой стороне этикетки.

QPushButton

  • У нас есть 12 кнопок диапазона строк и диапазона столбцов как 1, состоящих из чисел и арифметических операций, а его положение представлено как двумерный массив как buttons_ui. Когда кнопка нажата, она вызывает функцию self.add_to_screen и передает ее значение в buttons_ui.

Логика

Когда кнопка нажата, вызывается функция add_to_screen со значением вызываемой кнопки.

  • Если нажата кнопка AC, ярлыки очищаются и self.data сбрасывается.
  • Если вызывается DEL, последний ввод удаляется.
  • Для всех остальных входов обновляется self.data.
  • Каждый раз при вызове функции вычисляется результат и удаляются метки.

Мы используем функцию Python eval для выполнения логики вычислений. Создание нашей собственной eval функции выходит за рамки этой статьи. Если интересно, посмотрите это прочь.

QApplication

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

Исходный код можно найти здесь.

Компилировать

Python - это интерпретируемый язык, поэтому в большинстве случаев распределение времени является проблемой. К счастью, для приложения PyQt нам не нужно беспокоиться об этом. Мы можем создать исполняемый файл с помощью однострочной команды с помощью pyinstaller. Компиляция приложения - это однострочный процесс:

$ pyinstaller — onefile — windowed <filename>.py

Скомпилированный исполняемый файл будет в ./dist. Чтобы выполнить код:

$ ./dist/GUI

Приложение также можно скомпилировать для других платформ PyQtDeploy. Более подробная информация находится здесь.

Заключение

Благодаря этому мы успешно создали настольное приложение-калькулятор с использованием PyQt5. Надеюсь, эта статья оказалась для вас полезной. Если вам интересно, ознакомьтесь с введением в QT с использованием C ++ здесь.

Больше контента на plainenglish.io