2 added
2 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>21 мар 2025</li>
2
<ul><li>21 мар 2025</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>Мини-проект для знакомства с GNOME Builder и Cambalache.</p>
4
</ul><p>Мини-проект для знакомства с GNOME Builder и Cambalache.</p>
5
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
5
<p>Иллюстрация: Оля Ежак для Skillbox Media</p>
6
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
6
<p>Онлайн-журнал для тех, кто влюблён в код и информационные технологии. Пишем для айтишников и об айтишниках.</p>
7
<p>Эксперты по информационной безопасности из немецкого подразделения ESET<a>порекомендовали</a>пользователям Windows 10 перейти на Windows 11, поскольку в октябре 2025 года<a>заканчивается</a>поддержка. Однако системные требования Windows 11 не позволяют установить её на все старые компьютеры, поэтому в качестве альтернативы можно использовать Linux.</p>
7
<p>Эксперты по информационной безопасности из немецкого подразделения ESET<a>порекомендовали</a>пользователям Windows 10 перейти на Windows 11, поскольку в октябре 2025 года<a>заканчивается</a>поддержка. Однако системные требования Windows 11 не позволяют установить её на все старые компьютеры, поэтому в качестве альтернативы можно использовать Linux.</p>
8
<p>Если вы начинающий Python-разработчик и ищете повод попробовать Linux, сейчас самый подходящий момент. В этой статье мы покажем, как сделать строковый калькулятор для математических вычислений. Он поможет вам познакомиться с Linux и новыми инструментами разработки. Кто знает, возможно, именно после этого в мире станет на одного линуксоида больше.</p>
8
<p>Если вы начинающий Python-разработчик и ищете повод попробовать Linux, сейчас самый подходящий момент. В этой статье мы покажем, как сделать строковый калькулятор для математических вычислений. Он поможет вам познакомиться с Linux и новыми инструментами разработки. Кто знает, возможно, именно после этого в мире станет на одного линуксоида больше.</p>
9
<p><strong>Содержание</strong></p>
9
<p><strong>Содержание</strong></p>
10
<ul><li><a>Готовим необходимые инструменты</a></li>
10
<ul><li><a>Готовим необходимые инструменты</a></li>
11
<li><a>Создаём проект в GNOME Builder</a></li>
11
<li><a>Создаём проект в GNOME Builder</a></li>
12
<li><a>Подключаем библиотеку StringCalculator</a></li>
12
<li><a>Подключаем библиотеку StringCalculator</a></li>
13
<li><a>Создаём пользовательский интерфейс в Cambalache</a></li>
13
<li><a>Создаём пользовательский интерфейс в Cambalache</a></li>
14
<li><a>Запускаем калькулятор</a></li>
14
<li><a>Запускаем калькулятор</a></li>
15
</ul><p>Прежде всего мы рекомендуем ознакомиться с основами операционной системы Linux, выбрать подходящий дистрибутив, установить его и настроить Python. Наши статьи помогут вам быстро во всём разобраться.</p>
15
</ul><p>Прежде всего мы рекомендуем ознакомиться с основами операционной системы Linux, выбрать подходящий дистрибутив, установить его и настроить Python. Наши статьи помогут вам быстро во всём разобраться.</p>
16
<ul><li><a>Что такое Linux: гайд по самой свободной операционной системе</a></li>
16
<ul><li><a>Что такое Linux: гайд по самой свободной операционной системе</a></li>
17
<li><a>Лучшие дистрибутивы Linux: какую версию операционной системы выбрать</a></li>
17
<li><a>Лучшие дистрибутивы Linux: какую версию операционной системы выбрать</a></li>
18
<li><a>Как запустить Python офлайн и онлайн: руководство для новичка</a></li>
18
<li><a>Как запустить Python офлайн и онлайн: руководство для новичка</a></li>
19
</ul><p>Для разработки на Python мы будем использовать два мощных инструмента из экосистемы GNOME: Builder - современную интегрированную среду разработки (IDE) для написания кода и Cambalache - удобный визуальный редактор для создания графического интерфейса калькулятора на GTK.</p>
19
</ul><p>Для разработки на Python мы будем использовать два мощных инструмента из экосистемы GNOME: Builder - современную интегрированную среду разработки (IDE) для написания кода и Cambalache - удобный визуальный редактор для создания графического интерфейса калькулятора на GTK.</p>
20
<p>Оба инструмента доступны в магазине приложений<a>Flathub</a>, который обеспечивает безопасную установку программ в изолированной среде. Перейдите на страницы<a>Builder</a>и <a>Cambalache</a>и нажмите кнопку Установить. Система автоматически начнёт загрузку через менеджер пакетов - вам необходимо будет только подтвердить установку, когда появится запрос.</p>
20
<p>Оба инструмента доступны в магазине приложений<a>Flathub</a>, который обеспечивает безопасную установку программ в изолированной среде. Перейдите на страницы<a>Builder</a>и <a>Cambalache</a>и нажмите кнопку Установить. Система автоматически начнёт загрузку через менеджер пакетов - вам необходимо будет только подтвердить установку, когда появится запрос.</p>
21
<p>Если автоматическая установка не удалась, скопируйте команду загрузки со страницы приложения и вставить её в терминал. Также<a>проверьте</a>поддержку Flatpak в вашем дистрибутиве - если её нет, выполните настройку вручную.</p>
21
<p>Если автоматическая установка не удалась, скопируйте команду загрузки со страницы приложения и вставить её в терминал. Также<a>проверьте</a>поддержку Flatpak в вашем дистрибутиве - если её нет, выполните настройку вручную.</p>
22
<p>Общий план работы таков: мы создадим проект в GNOME Builder, добавим Python-библиотеку StringCalculator для обработки арифметических выражений, разработаем пользовательский интерфейс с помощью Cambalache и протестируем работу нашего калькулятора. Приступаем 👇</p>
22
<p>Общий план работы таков: мы создадим проект в GNOME Builder, добавим Python-библиотеку StringCalculator для обработки арифметических выражений, разработаем пользовательский интерфейс с помощью Cambalache и протестируем работу нашего калькулятора. Приступаем 👇</p>
23
<p>Запустите через меню приложений GNOME Builder, нажмите кнопку Создать новый проект и в открывшемся окне заполните следующие поля:</p>
23
<p>Запустите через меню приложений GNOME Builder, нажмите кнопку Создать новый проект и в открывшемся окне заполните следующие поля:</p>
24
<ul><li>Название проекта: calculator.</li>
24
<ul><li>Название проекта: calculator.</li>
25
<li>Идентификатор приложения (Application ID): можно оставить пустым.</li>
25
<li>Идентификатор приложения (Application ID): можно оставить пустым.</li>
26
<li>Язык программирования: выберите Python.</li>
26
<li>Язык программирования: выберите Python.</li>
27
<li>Шаблон: установите как Приложение среды GNOME.</li>
27
<li>Шаблон: установите как Приложение среды GNOME.</li>
28
<li>Местоположение проекта: выберите папку на компьютере, где будут храниться файлы калькулятора.</li>
28
<li>Местоположение проекта: выберите папку на компьютере, где будут храниться файлы калькулятора.</li>
29
</ul><p>После заполнения всех полей нажмите кнопку Создать проект.</p>
29
</ul><p>После заполнения всех полей нажмите кнопку Создать проект.</p>
30
<em>Скриншот:<a>GNOME Builder</a>/ Skillbox Media</em><p>В левой части окна Builder отображается структура файлов проекта:</p>
30
<em>Скриншот:<a>GNOME Builder</a>/ Skillbox Media</em><p>В левой части окна Builder отображается структура файлов проекта:</p>
31
<ul><li>Папка data: содержит файл описания нашего калькулятора, значок запуска, иконки и другие ресурсы.</li>
31
<ul><li>Папка data: содержит файл описания нашего калькулятора, значок запуска, иконки и другие ресурсы.</li>
32
<li>Папка po: хранит файлы переводов приложения на различные языки.</li>
32
<li>Папка po: хранит файлы переводов приложения на различные языки.</li>
33
<li>Каталог src: здесь находятся все исходные коды программы.</li>
33
<li>Каталог src: здесь находятся все исходные коды программы.</li>
34
</ul><p>По умолчанию GNOME Builder создаёт изолированные сборки приложений через Flatpak. Приложения работают в собственных контейнерах и полностью независимы от основной системы. Для управления изоляцией используется манифест Flatpak (файл .json) - конфигурационный файл, который определяет все необходимые компоненты приложения: системные библиотеки, модули Python и прочие зависимости. Этот манифест нам предстоит заполнить - вы найдёте его как файл org.gnome.Example.json.</p>
34
</ul><p>По умолчанию GNOME Builder создаёт изолированные сборки приложений через Flatpak. Приложения работают в собственных контейнерах и полностью независимы от основной системы. Для управления изоляцией используется манифест Flatpak (файл .json) - конфигурационный файл, который определяет все необходимые компоненты приложения: системные библиотеки, модули Python и прочие зависимости. Этот манифест нам предстоит заполнить - вы найдёте его как файл org.gnome.Example.json.</p>
35
<em>Скриншот:<a>GNOME Builder</a>/ Skillbox Media</em><p>При создании строкового калькулятора важно обеспечить корректный разбор арифметических выражений, вводимых пользователем. Программа должна правильно определять порядок выполнения операций с учётом скобок. Для этого необходим алгоритм, который может посимвольно анализировать строку, распознавать числа, операторы и скобки. Без такого алгоритма невозможно построить корректную последовательность вычислений.</p>
35
<em>Скриншот:<a>GNOME Builder</a>/ Skillbox Media</em><p>При создании строкового калькулятора важно обеспечить корректный разбор арифметических выражений, вводимых пользователем. Программа должна правильно определять порядок выполнения операций с учётом скобок. Для этого необходим алгоритм, который может посимвольно анализировать строку, распознавать числа, операторы и скобки. Без такого алгоритма невозможно построить корректную последовательность вычислений.</p>
36
<p>Например, для выражения 2 + (3 × 4) калькулятор должен сначала вычислить произведение в скобках (3 × 4 = 12), а затем прибавить к результату 2, чтобы в итоге получить 14. К счастью, нам не придётся выполнять эту задачу, поскольку Python-библиотека<a>StringCalculator</a>сделает всю работу за нас.</p>
36
<p>Например, для выражения 2 + (3 × 4) калькулятор должен сначала вычислить произведение в скобках (3 × 4 = 12), а затем прибавить к результату 2, чтобы в итоге получить 14. К счастью, нам не придётся выполнять эту задачу, поскольку Python-библиотека<a>StringCalculator</a>сделает всю работу за нас.</p>
37
<p>Чтобы добавить StringCalculator в калькулятор, откройте файл манифеста (org.gnome.Example.json) и вставьте следующий код в начало раздела modules. Builder установит библиотеку и настроит все зависимости:</p>
37
<p>Чтобы добавить StringCalculator в калькулятор, откройте файл манифеста (org.gnome.Example.json) и вставьте следующий код в начало раздела modules. Builder установит библиотеку и настроит все зависимости:</p>
38
{ "name": "StringCalculator", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"StringCalculator\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/62/86/50ac01ebf63c8f3c3ddd23eec68493765c1f6369ed1db4df5aa6e0a24d4a/StringCalculator-0.0.4.tar.gz", "sha256": "2c56fd149285be8a616a281579ab96f80be3bc26b253e9d32afe57322a02a2f3" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/81/1b/071431e8a00545d344587a7e639b475f13f3008f05e6268d246b7482cd80/StringCalculator-0.0.4-py3-none-any.whl", "sha256": "7844529b2b7a55e4384e30faaca91e3d5a2bf24d537154742f6f38eea6d9e76b" } ] }<p>После этого в манифесте должно следовать описание модуля приложения. Если сейчас запустить проект с помощью кнопки в верхней панели, на экране появится стандартное приветствие Hello, World!. У нас не появилось ошибок при запуске, и это означает, что модуль StringCalculator установлен корректно.</p>
38
{ "name": "StringCalculator", "buildsystem": "simple", "build-commands": [ "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"StringCalculator\" --no-build-isolation" ], "sources": [ { "type": "file", "url": "https://files.pythonhosted.org/packages/62/86/50ac01ebf63c8f3c3ddd23eec68493765c1f6369ed1db4df5aa6e0a24d4a/StringCalculator-0.0.4.tar.gz", "sha256": "2c56fd149285be8a616a281579ab96f80be3bc26b253e9d32afe57322a02a2f3" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/81/1b/071431e8a00545d344587a7e639b475f13f3008f05e6268d246b7482cd80/StringCalculator-0.0.4-py3-none-any.whl", "sha256": "7844529b2b7a55e4384e30faaca91e3d5a2bf24d537154742f6f38eea6d9e76b" } ] }<p>После этого в манифесте должно следовать описание модуля приложения. Если сейчас запустить проект с помощью кнопки в верхней панели, на экране появится стандартное приветствие Hello, World!. У нас не появилось ошибок при запуске, и это означает, что модуль StringCalculator установлен корректно.</p>
39
-
<em>Скриншот:<a>GNOME Builder</a>/ Skillbox Media</em><p>В папке src найдите файл window.ui, который содержит XML-разметку интерфейса калькулятора. Щёлкните правой кнопкой мыши по файлу и выберите: Открыть с помощью → Внешняя программа → Cambalache.</p>
39
+
<em>Ск��иншот:<a>GNOME Builder</a>/ Skillbox Media</em><p>В папке src найдите файл window.ui, который содержит XML-разметку интерфейса калькулятора. Щёлкните правой кнопкой мыши по файлу и выберите: Открыть с помощью → Внешняя программа → Cambalache.</p>
40
<p>При первом открытии интерфейс будет пустым, поскольку Cambalache использует формат файлов с расширением .cmb. Чтобы исправить это, нужно экспортировать файл: нажмите на кнопку с тремя точками в правом верхнем углу, выберите Export all UI и закройте Cambalache. После этого Builder покажет сообщение: Файл на диске был изменён. Нажмите кнопку Отказаться от изменений и перезагрузить, затем перезагрузите проект. В папке src появится новый файл window.cmb - его и открываем в Cambalache.</p>
40
<p>При первом открытии интерфейс будет пустым, поскольку Cambalache использует формат файлов с расширением .cmb. Чтобы исправить это, нужно экспортировать файл: нажмите на кнопку с тремя точками в правом верхнем углу, выберите Export all UI и закройте Cambalache. После этого Builder покажет сообщение: Файл на диске был изменён. Нажмите кнопку Отказаться от изменений и перезагрузить, затем перезагрузите проект. В папке src появится новый файл window.cmb - его и открываем в Cambalache.</p>
41
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>Сначала уберите метку с надписью Hello, World! - найдите элемент GtkLabel content label в дереве проекта и удалите его. Теперь добавьте контейнер GtkBox на его место. Для этого откройте меню Layout над макетом, выберите GtkBox, наведите курсор на нужное место в макете, вызовите контекстное меню правой кнопкой мыши и выберите пункт Add object here.</p>
41
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>Сначала уберите метку с надписью Hello, World! - найдите элемент GtkLabel content label в дереве проекта и удалите его. Теперь добавьте контейнер GtkBox на его место. Для этого откройте меню Layout над макетом, выберите GtkBox, наведите курсор на нужное место в макете, вызовите контекстное меню правой кнопкой мыши и выберите пункт Add object here.</p>
42
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>Удалите третью секцию, нажав<strong>Ctrl</strong>+<strong>Del</strong>. После этого измените ориентацию контейнера с горизонтальной на вертикальную - в правой панели найдите раздел orientation и выберите значение vertical из выпадающего списка.</p>
42
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>Удалите третью секцию, нажав<strong>Ctrl</strong>+<strong>Del</strong>. После этого измените ориентацию контейнера с горизонтальной на вертикальную - в правой панели найдите раздел orientation и выберите значение vertical из выпадающего списка.</p>
43
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>В верхнюю секцию вставьте ещё один контейнер GtkBox с горизонтальной ориентацией. После этого добавлять компоненты калькулятора станет проще - достаточно щёлкнуть левой кнопкой мыши по нужной области макета.</p>
43
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>В верхнюю секцию вставьте ещё один контейнер GtkBox с горизонтальной ориентацией. После этого добавлять компоненты калькулятора станет проще - достаточно щёлкнуть левой кнопкой мыши по нужной области макета.</p>
44
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>Продолжим работу с верхней секцией калькулятора. В левую часть добавьте поле для ввода арифметических выражений - откройте меню Control над макетом и выберите GtkEntry. В правую часть поместите кнопку для вычисления результата - снова откройте меню Control и выберите GtkButton.</p>
44
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>Продолжим работу с верхней секцией калькулятора. В левую часть добавьте поле для ввода арифметических выражений - откройте меню Control над макетом и выберите GtkEntry. В правую часть поместите кнопку для вычисления результата - снова откройте меню Control и выберите GtkButton.</p>
45
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>В нижнюю часть главного контейнера добавьте поле для отображения результата - откройте меню Display и выберите виджет GtkTextView.</p>
45
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>В нижнюю часть главного контейнера добавьте поле для отображения результата - откройте меню Display и выберите виджет GtkTextView.</p>
46
<p>Интерфейс нашего калькулятора почти готов. Осталось только вернуться к кнопке и в правой панели в разделе label добавить надпись CALCULATE.</p>
46
<p>Интерфейс нашего калькулятора почти готов. Осталось только вернуться к кнопке и в правой панели в разделе label добавить надпись CALCULATE.</p>
47
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>Чтобы обращаться к элементам интерфейса в программе, нам необходимо добавить идентификаторы для каждого виджета. Для этого выделите нужный виджет и в правой панели заполните поле Object Id. Для GtkEntry укажите entry, для GtkButton - calculate_button, а для GtkTextView - text_view.</p>
47
<em>Скриншот:<a>Cambalache</a>/ Skillbox Media</em><p>Чтобы обращаться к элементам интерфейса в программе, нам необходимо добавить идентификаторы для каждого виджета. Для этого выделите нужный виджет и в правой панели заполните поле Object Id. Для GtkEntry укажите entry, для GtkButton - calculate_button, а для GtkTextView - text_view.</p>
48
<p>Чтобы сохранить созданный интерфейс в файле window.ui, нажмите на кнопку с тремя точками в правом верхнем углу, выберите Export all UI, а затем в Builder нажмите на кнопку Отказаться от изменений и перезагрузить.</p>
48
<p>Чтобы сохранить созданный интерфейс в файле window.ui, нажмите на кнопку с тремя точками в правом верхнем углу, выберите Export all UI, а затем в Builder нажмите на кнопку Отказаться от изменений и перезагрузить.</p>
49
<p>В Builder перейдите в папку src и откройте файл window.py - в нём мы напишем основной код калькулятора. Для начала добавим в секцию импортов класс SolveMathProblem из Python-библиотеки StringCalculator:</p>
49
<p>В Builder перейдите в папку src и откройте файл window.py - в нём мы напишем основной код калькулятора. Для начала добавим в секцию импортов класс SolveMathProblem из Python-библиотеки StringCalculator:</p>
50
from StringCalculator import SolveMathProblem<p>Теперь добавим объявления виджетов интерфейса калькулятора и после шаблонной строки label = Gtk.Template.Child() вставим следующий код:</p>
50
from StringCalculator import SolveMathProblem<p>Теперь добавим объявления виджетов интерфейса калькулятора и после шаблонной строки label = Gtk.Template.Child() вставим следующий код:</p>
51
calculate_button = Gtk.Template.Child() entry = Gtk.Template.Child() text_view = Gtk.Template.Child()<p>Далее в Python-функции __init__ добавим обработчик события нажатия кнопки, который будет вычислять результат. Для этого свяжем сигнал clicked кнопки с функцией-обработчиком on_calculate_clicked: self.calculate_button.connect ("clicked", self.on_calculate_clicked).</p>
51
calculate_button = Gtk.Template.Child() entry = Gtk.Template.Child() text_view = Gtk.Template.Child()<p>Далее в Python-функции __init__ добавим обработчик события нажатия кнопки, который будет вычислять результат. Для этого свяжем сигнал clicked кнопки с функцией-обработчиком on_calculate_clicked: self.calculate_button.connect ("clicked", self.on_calculate_clicked).</p>
52
<p>Также в функции __init__ создадим переменную text - пустую строку для хранения истории вычислений. В неё будут добавляться все введённые выражения и их результаты, которые затем отобразятся в поле text_view.</p>
52
<p>Также в функции __init__ создадим переменную text - пустую строку для хранения истории вычислений. В неё будут добавляться все введённые выражения и их результаты, которые затем отобразятся в поле text_view.</p>
53
<p>В итоге функция инициализации калькулятора должна выглядеть так:</p>
53
<p>В итоге функция инициализации калькулятора должна выглядеть так:</p>
54
def __init__(self, **kwargs): super().__init__(**kwargs) self.text = "" self.calculate_button.connect("clicked", self.on_calculate_clicked)<p>Нам осталось добавить в калькулятор функцию-обработчик:</p>
54
def __init__(self, **kwargs): super().__init__(**kwargs) self.text = "" self.calculate_button.connect("clicked", self.on_calculate_clicked)<p>Нам осталось добавить в калькулятор функцию-обработчик:</p>
55
def on_calculate_clicked(self, widget): # Проверяем содержимое поля ввода if len(self.entry.get_text().strip()) == 0: # Если поле пустое, выводим сообщение об ошибке self.text_view.get_buffer().set_text(_("Enter an arithmetic expression")) self.entry.grab_focus() # Возвращаем фокус на поле ввода return # Получаем введённое пользователем арифметическое выражение problem = self.entry.get_text() try: # Пытаемся вычислить результат, передавая выражение в функцию SolveMathProblem result = SolveMathProblem(problem) except ZeroDivisionError: # Выводим ошибку, если кто-то попытается поделить на ноль self.text_view.get_buffer().set_text(_("Division by zero!")) self.entry.grab_focus() # Возвращаем фокус на поле ввода return except Exception as e: # Обрабатываем другие типы ошибок self.text_view.get_buffer().set_text(_("Invalid expression")) self.entry.grab_focus() # Возвращаем фокус на поле ввода return # Формируем строку с результатом, чтобы добавить её к истории вычислений self.text += problem + "=" + str(result) + "\n" # Обновляем текстовое поле с результатом self.text_view.get_buffer().set_text(self.text)<p>Наш калькулятор на Python готов к использованию! Запустите проект с помощью кнопки в верхней панели GNOME Builder и протестируйте его работу. Например, введите 2 + 2 × 2 и убедитесь, что калькулятор правильно применяет порядок операций, выдавая результат 6. Также попробуйте разделить число на ноль или нажать кнопку при пустой строке ввода.</p>
55
def on_calculate_clicked(self, widget): # Проверяем содержимое поля ввода if len(self.entry.get_text().strip()) == 0: # Если поле пустое, выводим сообщение об ошибке self.text_view.get_buffer().set_text(_("Enter an arithmetic expression")) self.entry.grab_focus() # Возвращаем фокус на поле ввода return # Получаем введённое пользователем арифметическое выражение problem = self.entry.get_text() try: # Пытаемся вычислить результат, передавая выражение в функцию SolveMathProblem result = SolveMathProblem(problem) except ZeroDivisionError: # Выводим ошибку, если кто-то попытается поделить на ноль self.text_view.get_buffer().set_text(_("Division by zero!")) self.entry.grab_focus() # Возвращаем фокус на поле ввода return except Exception as e: # Обрабатываем другие типы ошибок self.text_view.get_buffer().set_text(_("Invalid expression")) self.entry.grab_focus() # Возвращаем фокус на поле ввода return # Формируем строку с результатом, чтобы добавить её к истории вычислений self.text += problem + "=" + str(result) + "\n" # Обновляем текстовое поле с результатом self.text_view.get_buffer().set_text(self.text)<p>Наш калькулятор на Python готов к использованию! Запустите проект с помощью кнопки в верхней панели GNOME Builder и протестируйте его работу. Например, введите 2 + 2 × 2 и убедитесь, что калькулятор правильно применяет порядок операций, выдавая результат 6. Также попробуйте разделить число на ноль или нажать кнопку при пустой строке ввода.</p>
56
<p>Калькулятор уже работает, но его можно улучшить. Вот несколько идей:</p>
56
<p>Калькулятор уже работает, но его можно улучшить. Вот несколько идей:</p>
57
<ul><li>Добавьте боковые отступы для главного контейнера GtkBox, чтобы интерфейс стал более аккуратным.</li>
57
<ul><li>Добавьте боковые отступы для главного контейнера GtkBox, чтобы интерфейс стал более аккуратным.</li>
58
<li>Сделайте кнопку очистки для поля ввода выражений калькулятора.</li>
58
<li>Сделайте кнопку очистки для поля ввода выражений калькулятора.</li>
59
<li>Привяжите функцию on_calculate_clicked к клавише Enter для быстрого получения результата без мыши.</li>
59
<li>Привяжите функцию on_calculate_clicked к клавише Enter для быстрого получения результата без мыши.</li>
60
<li>Попробуйте использовать функцию re.sub() из модуля re для удаления лишних пробелов в выражении перед обработкой. Подробнее об этом можно прочитать в статье про<a>регулярные выражения в Python</a>.</li>
60
<li>Попробуйте использовать функцию re.sub() из модуля re для удаления лишних пробелов в выражении перед обработкой. Подробнее об этом можно прочитать в статье про<a>регулярные выражения в Python</a>.</li>
61
</ul><p>Вот несколько материалов, которые помогут вам в доработке калькулятора:</p>
61
</ul><p>Вот несколько материалов, которые помогут вам в доработке калькулятора:</p>
62
<ul><li><a>Документация GTK 4</a> - руководство по созданию интерфейсов.</li>
62
<ul><li><a>Документация GTK 4</a> - руководство по созданию интерфейсов.</li>
63
<li><a>Учебник по Python GTK</a> - пошаговые инструкции с примерами кода.</li>
63
<li><a>Учебник по Python GTK</a> - пошаговые инструкции с примерами кода.</li>
64
<li><a>GNOME Discourse</a> - форум для обсуждения и обмена опытом.</li>
64
<li><a>GNOME Discourse</a> - форум для обсуждения и обмена опытом.</li>
65
<li><a>Документация Cambalache</a>и <a>GNOME Builder</a> - руководства к нашим инструментам для проектирования и разработки GTK-приложений.</li>
65
<li><a>Документация Cambalache</a>и <a>GNOME Builder</a> - руководства к нашим инструментам для проектирования и разработки GTK-приложений.</li>
66
</ul><p>Python для всех</p>
66
</ul><p>Python для всех</p>
67
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
67
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
68
<p><a>Пройти бесплатно</a></p>
68
<p><a>Пройти бесплатно</a></p>
69
-
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
69
+
<a><b>Бесплатный ��урс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>