Вряд ли может быть калькулятор проще, но он вполне пригоден для демонстрации основ. В этом окне имеются кнопки для ввода чисел, имен переменных и операторов. Оно строится путем вставки кнопок во фреймы: каждый ряд кнопок представляет собой вложенный экземпляр класса Frame, и сам графический интерфейс также является подклассом Frame, в который вставлены поле Entry и шесть вложенных фреймов рядов (точно так же можно было бы использовать компоновку по сетке). Фрейм калькулятора, поле ввода и кнопки сделаны растягиваемыми в импортированном вспомогательном модуле widgets, реализованном нами в примере 10.1.
Этот калькулятор конструирует строку, которая целиком должна быть передана интерпретатору Python при нажатии кнопки eval (вычислить). Поскольку в поле ввода можно ввести любое выражение или инструкцию языка Python, кнопки существуют только для удобства. На самом деле поле ввода не слишком отличается от командной строки. Попробуйте ввести import sys, а затем dir(sys), чтобы вывести атрибуты модуля sys вверху в поле ввода — обычно калькулятор так не используют, однако эта особенность достаточно показательна.
В конструкторе CalcGui кнопки реализованы в виде списков строк; каждая строка представляет ряд, а каждый символ в строке — кнопку. С целью сохранения дополнительных данных, необходимых функциям обратного вызова для каждой кнопки, используются lambda-выражения. Функции обратного вызова сохраняют символ кнопки и связанную переменную с текстовым значением, чтобы обеспечить добавление символа в конец текущей строки элемента ввода при нажатии кнопки.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011