Введение
Учитывая современные реалии, многие обладают навыками пользователя персонального компьютера, некоторые умеют администрировать компьютер, настраивать программы и устанавливать компоненты аппаратного обеспечения согласно инструкции, но только тот, кто умеет программировать может создать принципиально новую программу.
Написание кода – это профессия, в которой большую роль играет самообразование. Это постоянно прогрессирующая и совершенствующаяся область, и для того, чтобы оставаться грамотным специалистом, необходимо посвящать немалую часть времени знакомству с новыми разработками и технологиями.
Python – идеальный язык для новичка. Код на Python легко писать и читать, язык стабильно занимает высокие места в рейтингах популярности, а «питонисты» востребованы почти во всех сферах IT – программировании, анализе данных, системном администрировании и тестировании. YouTube, Intel, Pixar, NASA, VK, Яндекс – вот лишь немногие из известных компаний, которые используют Python в своих продуктах.
Изучая программирование в школе и занимаясь самостоятельно, можно еще будучи учеником начать создавать свое портфолио проектов, осваивая при этом перспективное направление IT-сферы – разработку приложений. Это не только увлекательный и интересный процесс, но и возможность заработка на фрилансе.
Программирование на Python, относительно других сфер деятельности, позволяет очень быстро увидеть результат своей работы, и именно это обстоятельство делает его особо привлекательным. Программист, наверное, одна из немногих профессий, которые можно начинать осваивать уже в школе. В этом заключается актуальность моей работы.
Цель моей работы: изучить историю программирования и рассмотреть язык программирования Python на современном рынке труда, создать приложение на основе GUI фреймворков языка программирования Python. В соответствии с поставленной целью были выдвинуты следующие задачи:
Изучить историю появления и развития программирования.
Изучить историю становления языка программирования Python, его особенности и популярность на сегодняшний момент.
3. Определить самые популярные GUI фреймворки на языке программирования Python.
4. Выбрать подходящий GUI фреймворк для создания приложения.
5. Определиться с внешним видом и форматом будущего приложения.
6. Создать приложение и провести его отладку.
Объект исследования: GUI фреймворки на языке программирования Python
Предмет исследования: Кросс-платформенный фреймворк Tkinter для программирования GUI на Python.
Мной была сформулированы гипотеза: При должном изучении теоретического материала новичок-программист может самостоятельно создать исполняемый файл (создать приложение).
Методы исследования:
Практический метод (создание приложения).
Изучение статей и научной литературы.
Поиск и анализ информации в Интернете.
Выводы.
Начать историю языков программирования нужно с истоков. Физические принципы работы электронных устройств ЭВМ таковы, что компьютер может воспринимать команды, состоящие только из единиц и нулей – последовательность перепада напряжения, то есть машинный код. В 1843 году Ада Лавлейс изобретает первый в истории машинный алгоритм для разностной машины Чарльза Бэббиджа, который закладывает основу для всех языков программирования.
Как показала в дальнейшем практика общения с компьютером, такой язык громоздок и неудобен. При пользовании им легко допустить ошибку, записав не в той последовательности 1 или 0. Программу очень трудно контролировать. Кроме того, при программировании в машинных кодах надо хорошо знать внутреннюю структуру ЭВМ, принцип работы каждого блока. И самое плохое в таком языке, что программы на данном языке – очень длинные последовательности единиц и нулей являются машиннозависимыми, то есть для каждой ЭВМ необходимо было составлять свою программу, а также программирование в машинных кодах требует от программиста много времени, труда, повышенного внимания.
Довольно скоро стало понятно, что процесс формирования машинного кода можно автоматизировать. Уже в 1950 году для записи программ начали применять мнемонический язык – язык ассемблера. Язык ассемблера позволил представить машинный код в более удобной для человека форме: для обозначения команд и объектов, над которыми эти команды выполняются, вместо двоичных кодов использовались буквы или сокращенные слова, которые отражали суть команды. Например, на языке ассемблера команда сложения двух чисел обозначается словом «add», тогда как ее машинный код может быть таким: «000010».
Ассемблер – язык программирования низкого уровня. Язык программирования низкого уровня – язык программирования, который ориентирован на конкретный тип процессора и учитывает его особенности. В данном случае «низкий уровень» не значит «плохой». Имеется в виду, что операторы языка близки к машинному коду и ориентированы на конкретные команды процессора. Появление языка ассемблера значительно облегчило жизнь программистов, так как теперь вместо рябящих в глазах нулей и единиц, они могли писать программу командами, состоящими из символов приближенных к обычному языку. Для того времени этот язык был новшеством и пользовался популярностью так как позволял писать программы небольшого размера, что при тех машинах критерий значительный.
Но сложность разработки в нём больших программных комплексов привела к появлению языков третьего поколения – языков высокого уровня. Но на этом применение ассемблера не закончилось, он пользуется популярностью в узких кругах и по сей день. Сейчас его используют в написании отдельных фрагментов программ или иногда в написании самих программ. Примеров может быть много, но самые яркие это использование ассемблера в написании драйверов, игр и загрузчиков ОС. Не стоит забывать, что у хакеров этот язык так же пользуется популярностью, в связи с тем, что скорость работы полученной программы значительно выше скорости программы, написанной на языке программирования высокого уровня. Это объясняется тем, что получившийся размер программы очень мал. Разработчики антивирусов так же используют ассемблер в некоторых модулях своих программ, что так же обеспечивает их быстродействие.
С середины 50-х г. XX в. начали создавать первые языки программирования высокого уровня. Эти языки не были привязаны к определенному типу ЭВМ. Для каждого из них были разработаны собственные компиляторы. Компиляция – трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке, близком машинному коду.
Первый язык высокого уровня Фортран был создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса в корпорации IBM. Он предназначался для научных и технических расчетов. Название Fortran является сокращением от FORmula TRANslator (переводчик формул).
В конце 1953 Джон Бэкус предложил начать разработку эффективной альтернативы ассемблеру для программирования на ПК IBM 704. Уже к середине 1954 была закончена черновая спецификация языка Fortran. Первое руководство для Fortran появилось в октябре 1956 вместе с первым компилятором, поставленным в апреле 1957. Компилятор был оптимизирующим, потому что клиенты отказывались использовать язык программирования высокого уровня, который генерировал код с производительностью ниже, чем у ассемблера.
Фортран широко использовался в основном для научных и инженерных вычислений. Он прекрасно подходит для решения численных задач, так как за время его существования было написано множество библиотек. Он используется и по сей день, но не столько по причине удачного дизайна, сколько в силу большого количества написанных на нём программ, изменять и, тем более, переписывать которые нет смысла. Его структура способствует тому, что компилятор может очень хорошо оптимизировать вычисления.
Поскольку Фортран оказался столь успешным языком, в Европе возникли опасения, что IBM будет доминировать в компьютерной отрасли. С этого момента развитие языков программирования начало набирать бурный рост и в ближайшие годы были разработаны некоторые языки программирования: COBOL (1959), Паскаль (1970), BASIC (1964), C (1972).
На данный момент существует множество различный языков, подходящих для различных задач, например: C++, C#, Java. Но мы остановимся на языке Python.
История языка программирования Python началась в конце 1980-х. Гвидо ван Россум задумал Python в 1980-х годах, а приступил к его созданию в декабре 1989 года в центре математики и информатики в Нидерландах. Язык Python был задуман как потомок языка программирования ABC, способный к обработке исключений и взаимодействию с операционной системой Amoeba.
В феврале 1991 года Гвидо ван Россум опубликовал код Python, помеченный версией 0.9.0, на alt.sources. На этой стадии в нём уже присутствовали классы с наследованием, обработка исключений, функции и основные типы данных: list, dict, str и т. д.. Также в этом начальном релизе были модули, заимствованные из Modula-3. Ван Россум описывал модуль как «один из главных элементов в программировании на Python». Модель обработки исключений в Python тоже походила на Modula-3 с добавлением оператора else. В 1994 году с ростом числа пользователей сформировалась группа comp.lang.python – основной форум Python.
Версия Python 2.0 была выпущена 16 октября 2000 года и включала в себя много новых крупных функций – таких как полный сборщик мусора и поддержка Unicode. Однако наиболее важным из всех изменений было изменение самого процесса развития языка и переход на более прозрачный процесс его создания.
Первая обратно-несовместимая версия Python 3.0 была выпущена 3 декабря 2008 года после длительного периода тестирования. Многие её функции были портированы и обратно совместимы с Python 2.6 и Python 2.7.
Даты выпуска основных и промежуточных версий:
Python 1.0 – январь 1994 года
Python 1.5 – 31 декабря 1997 года
Python 1.6 – 5 сентября 2000 года
Python 2.0 – 16 октября 2000 года
Python 2.1 – 17 апреля 2001 года
Python 2.2 – 21 декабря 2001 года
Python 2.3 – 29 июля 2003 года
Python 2.4 – 30 ноября 2004 года
Python 2.5 – 19 сентября 2006 года
Python 2.6 – 1 октября 2008 года
Python 2.7 – 3 июля 2010 года
Python 3.0 – 3 декабря 2008 год
Python 3.1 – 27 июня 2009 года
Python 3.2 – 20 февраля 2011 года
Python 3.3 – 29 сентября 2012 года
Python 3.4 – 16 марта 2014 года
Python 3.5 – 13 сентября 2015 года
Python 3.6 – 23 декабря 2016 года
Python 3.7 – 27 июня 2018 года
Python 3.8 – 14 октября 2019 года
Python 3.9 – 5 октября 2020 года
Python 3.10 – 4 октября 2021 года
Python 3.11 – 22 октября 2022 года
Гвидо ван Россум – голландский программист, прежде всего известный как автор языка программирования Python. Среди разработчиков Python Гвидо известен как «великодушный пожизненный диктатор» проекта, что означает, что он продолжает наблюдать за процессом разработки Python, принимая окончательные решения, когда это необходимо. С июля 2018 года Гвидо ушел в постоянный отпуск от диктаторства, оставив за собой право быть обычным разработчиком.
Ван Россум родился и вырос в Нидерландах, где он закончил Амстердамский университет по специальности «математика и информатика» в 1982 году. Затем он работал в различных исследовательских институтах, в том числе Голландском центре математики и информатики, Национальном Институте Стандартов и Corporation for National Research Initiatives.
В декабре 2005 года ван Россум был принят на работу в Google, где он разработал на Python веб-приложение для рецензирования кода Mondrian. Также принимал активное участие в разработке компанией Google сервиса хостинга сайтов и web-приложений Google App Engine. 7 декабря 2012 года был последним днём работы в Google. C 1 января 2013 приступил к работе в Dropbox.
В октябре 2019 года покинул Dropbox и вышел на пенсию.
Основной особенностью данного языка программирования является то, что его достаточно просто понять и изучить. Причем сделать это могут даже те, кто никогда раньше не сталкивался с программированием. А тем, кто уже имеет опыт написания приложения на других языках, изучение Python и вовсе не составит никакого труда.
Одним из важнейших отличий этого языка от Java или C заключается в том, что для написания приложений здесь используется меньше кода. То есть написать свое первое приложение ученик сможет намного быстрее.
Еще одна особенность заключается в том, что у Python есть множество библиотек, с помощью которых достичь своих целей в программировании можно намного быстрее. Например, Pygame позволяет написать игры и мультимедийные приложения. Для работы с bigdata используется библиотека Pandas. Django применяется для серверной части при разработке различных приложений.
Python используется в работе крупных компаний. Например, этот язык применяется для анализа данных и создания рекомендаций в известных розничных онлайн сетях Amazon и Spotify. Walt Disney использует Python для создания анимаций.
Такие известные социальные сети и онлайн стрим площадки как Instagram (площадка признана экстремистской и запрещенной на территории России, заблокирована РКН) и Youtube целиком написаны на Python. Наконец, язык применяется NASA для автоматизации процессов WAS. А теперь давайте посмотрим, в каких сферах применяется данный язык разработки. Используется Python и АНБ США для шифрования и анализа информации.
В отличие от закрытых и устоявшихся языков программирования, каждый разработчик может внести свой вклад в развитие Python. Например, если пользователем найден какой-то баг или он хочет расширить функциональные возможности языка, то достаточно выполнить pull request в репозиторий на github или просто сообщить о своих идеях во вкладке issues. Такая открытость дает уверенность, что Python не содержит потенциальных уязвимостей, тайных функций слежений или других опасных аспектов.
Благодаря своим особенностям, Python занимает 1 строчку в январе 2022 года по индексу TIOBE. Данный рейтинг показывает актуальность языков программирования у интернет-пользователей путём анализа запросов в разных поисковых системах.
Для именования переменных и правильного оформления кода существует стандарт PEP 8 (Python Enhancement Proposals), который следует соблюдать. Он был составлен в 2001 году Гвидо ван Россумом, Барри Варшавой и Ником Когланом. Согласно стандарту PEP 8, имена переменных должны содержать маленькие буквы английского алфавита и символ «подчёркивание» для разделения слов в имени. Пример имён переменных по стандарту: value, first_value.
Нельзя использовать следующие однобуквенные имена переменных:
I (большая английская i);
l (маленькая английская L);
O.
Эти однобуквенные имена усложнят читаемость кода, так как могут быть перепутаны между собой или с цифрами. Как сказал Гвидо ван Россум: «Код читают гораздо чаще, чем пишут». Во время написания программы, зачастую требуется возвращаться к уже написанному коду, по - этому следование стандарту PEP 8 очень важно.
Следование PEP 8 особенно важно, если вы претендуете на должность разработчика. Написание понятного, читаемого кода свидетельствует о профессионализме. Это скажет работодателю, что вы понимаете, как правильно структурировать свой код.
Работая над проектами, вам, скорее всего, придется сотрудничать с другими программистами. Здесь, опять же, очень важно писать читаемый код. Другие люди, которые, возможно, никогда раньше не встречали вас и не видели ваш стиль программирования, должны будут прочитать и понять ваш код. Наличие руководящих принципов, которым вы следуете и которые знаете, облегчит другим чтение вашего кода.
Разработчики языка Python придерживаются определённой философии программирования, называемой «The Zen of Python». Её текст выдаётся интерпретатором Python по команде “import this” и выглядит следующим образом:
Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
Особые случаи не настолько особые, чтобы нарушать правила.
При этом практичность важнее безупречности.
Ошибки никогда не должны замалчиваться.
Если они не замалчиваются явно.
Встретив двусмысленность, отбрось искушение угадать.
Должен существовать один и, желательно, только один очевидный способ сделать это.
Хотя он поначалу может быть и не очевиден, если вы не голландец.
Сейчас лучше, чем никогда.
Хотя никогда зачастую лучше, чем прямо сейчас.
Если реализацию сложно объяснить – идея плоха.
Если реализацию легко объяснить – идея, возможно, хороша.
Пространства имён – отличная штука! Будем делать их больше!
Фреймворки – это наборы модулей или пакетов, помогающих разработчикам писать веб-приложения на языке Python. Главной задачей этих инструментов разработки является упрощение рутинных процессов программирования и поддержка сложных с технической точки зрения проектов.
Фреймворки помогают ускорить разработку и сделать её приятнее. Программу, которая раньше писалась неделю и занимала 1000 строк, с помощью фреймворка вы можете создать за пару часов и уместить в 50 строчках кода. Некоторые решения даже поставляются в виде подписки на сервисы, и программисту остаётся только написать шаблонный код — остальное сервис сделает сам.
Выбирая фреймворки разработчику, всегда нужно помнить о целях их использования. Так, например, для создания игр в Python создано большое количество библиотек, и выбирая среди них необходимо объективно оценивать сложность задумки и задумки и уровнем профессионализма самого разработчика.
Для создания приложений на языке Python необходим графический интерфейс пользователя, называем GUI.
GUI – это человеко-компьютерный интерфейс. Другими словами, это способ, с помощью которого люди могут взаимодействовать с компьютерами. Он использует окна, значки, меню. Манипулировать GUI можно как с помощью мышки, так и с помощью клавиатуры. Любая GUI-библиотека содержит виджеты – это наборы графических элементов управления. При создании GUI программы обычно используется каскадный способ. Графические элементы управления добавляются поверх друг друга.
Существует много вариантов Python GUI. Есть больше 30 кросс-платформенных фреймворков для программирования GUI на Python. Вот некоторые из них.
1. Tkinter – это набор инструментов, который может формировать GUI с помощью Python. Он позволяет вам запускать сценарии на Python в GUI-формате.
2. Flexx. Многие GUI-библиотеки Python основаны на библиотеках, написанных на других языках, таких как C ++. Например, wxWidgets и libavg. Flexx создана на Python. Для отображения GUI использует веб-технологию.
3. CEF Python. Этот фреймворк нацелен на Windows, MAC OS и Linux. Основан на Google Chromium. Основное внимание в нем уделяется облегчению использования встроенного браузера в сторонних приложениях.
4. Dabo. Цель этого фреймворка – WxPython. Это трехуровневый фреймворк для разработки кросс-платформенных приложений.
5. Kivy основан на OpenGL ES 2. У него есть собственный multi-touch для каждой отдельной платформы. Это событийно-ориентированный фреймворк, который прекрасно подходит для разработки игр.
6. Pyforms – это фреймворк Python 2.7/3.x для разных окружений, используемый для разработки GUI приложения. В нем поощряется повторное использование кода.
7. С помощью PyGObject можно писать на Python приложения для проекта GNOME. Также можно писать приложения на Python, использующие GTK+.
8. PyQt – это кросс-платформенный фреймворк. Он написан на С++. Это очень полная библиотека, включающая много инструментов и API. Широко используется во многих отраслях. Охватывает множество платформ.
9. PySide является обёрткой для Qt. PySide и PyQt отличаются тем, что последний является коммерчески доступным.
10. PyGUII предназначен для платформ Unix, Macintosh и Windows. Фокус этого MVC-фреймворка заключается в том, чтобы вписываться в экосистему Python с максимальной легкостью.
11. libavg. Это сторонняя библиотека, написанная на С++. Обладает следующими особенностями: показ элементов в форме переменных Python, система управления событиями, таймеры, поддержка логов.
12. PyGTK | PyGObject. «GTK+», широко используемая в Linux, является «GTK + «обёртка из» PyGTK». По сравнению с Kivy и PyQt, PyGTK очень легок для платформ Unix, Macintosh, Windows. Этот MVC-фреймворк разработан Грегом Эвингом из университета Кентербери (Новая Зеландия). Его главный фокус – как можно более простая адаптация к экосистеме Python.
Изучив теоретическую сторону вопроса и получив первые представления о GUI фреймворках я остановил свой выбор на фреймворке Tkinter, поскольку моих навыков достаточно для его освоения. Различные источники в сети интернет также рекомендовали Tkinter в качестве первого изучаемого GUI фреймворка.
Чтобы выполнить практическую часть своей исследовательской работы, я составил алгоритм действий:
Освоить графические примитивы Tkinter (Label, Button, Entry, заголовки и тд.).
Определиться с направлением будущего приложения (поставить задачу, которую будет выполнять продукт исследования).
Написать программу.
Произвести отладку программы.
Преобразовать файла Python (файл с расширением .py) в исполняемый файл (файл с расширением .exe).
Получить отзывы о работе приложения от знакомых для выявления недостатков и достоинств моего приложения по сравнению с другими.
Доработка приложения с учетом отзывов.
Для освоения графических примитивов мне понадобился месяц. За это время я научился создавать отдельное окно, присваивать ему заголовок, добавлять виджеты (надписи, кнопки, поля ввода текста) и кастомизировать их. Очень важно для меня было научиться добавлять функционал для моих кнопок: создавать действия при нажатии на них, давать реакцию на другие действия. Этому процессу я уделил достаточно много времени.
По истечении месяца, работая над освоением графических примитивов, я определился с направлением моего будущего приложения. С самого начала мне хотелось создать что–либо функциональное и полезное в будущем, поэтому изначально выбор пал на создание калькулятора. Да, на данный момент существует большой выбор приложений, выполняющих вычислительные функции, но именно на основе этого приложения можно совершенствовать свои навыки в работе с GUI, и реализовывать свои самые смелые замыслы. Ещё в 8 классе я заметил, что приложений, решающих квадратные уравнения, я не встречал, а пользоваться сайтами не всегда удобно, и я решил создать портативное приложение, которое можно запустить в любой момент, не тратя время на поиск его в интернете. Таким образом возникла идея совмещения обычного классического окна калькулятора с окном решения квадратных уравнений.
Для того чтобы решать такие уравнения, необходимо знать определённый алгоритм, поэтому я еще раз повторил теорию по этой теме.
Квадратное уравнение — это уравнение вида , где коэффициенты и — произвольные числа, причем . Все квадратные уравнения можно условно разделить на три класса:
Не имеют корней;
Имеют ровно один корень;
Имеют два различных корня.
В этом состоит важное отличие квадратных уравнений от линейных, где корень всегда существует и единственен. Для определения количества корней уравнения необходим дискриминант. Для вышеописанного квадратного уравнения он будет находиться по формуле . По знаку дискриминанта можно определить, сколько корней имеет квадратное уравнение. А именно:
Если , корней нет;
Если , есть ровно один корень;
Если , корней будет два.
Таким образом, при реализации задумки будет необходимым опора на математику и описанные выше случаи.
После длительной подготовки и изучения многих аспектов написания программы, я приступил к работе. Как я писал выше, особенность языка программирования Python заключается в том, что процесс написания программы тесно связан с отладкой текста. От момента написания первый версии программы по решению квадратных уравнений до конечного продукта прошло около трёх недель. За это время код программы был неоднократно переписан и оформлен в разных вариациях.
Рисунок 1. Калькулятор квадратных уравнений
Рисунок 2. Калькулятор 1.0
Д ля создания приложения «Калькулятор» я отобрал арифметические операции, которые чаще всего используются и присутствуют в стандартных приложениях (например, встроенное приложение «Калькулятор» на Windows в режиме «обычный»): сложение, вычитание, деление, умножение. Первая версия содержала только эти команды, но была работоспособной (Рисунок 2).
Таким образом у меня получилось два отдельных приложения: калькулятор, включающий себя основные арифметические действия и калькулятор, решающий квадратные уравнения.
Осталось определиться со способом их объединения. Возникло две концептуально различные идеи:
В основном окне калькулятора будет добавлена кнопка для запуска подприложения. Так, окно калькулятора не будет громоздким и при необходимости подприложение открывается поверх калькулятора.
В одном окне реализуется сразу два приложения, что не перегружает оперативную память. При подобранном стиле, окно будет смотреться эстетично, а само приложение подчеркнет свою уникальность функционала.
Продолжая процесс отладки, я получил новую версию, в которой добавились функции возведение во вторую степень, вынесение из-под знака квадратного корня, а также кнопка для запуска отдельного окна решения квадратных уравнений. По итогу, была реализована первая идея объединения двух приложений. Причины были следующие:
Пользователю не всегда требуется калькулятор по решению квадратных уравнений;
При реализации замысла первый способ оказался более реализуем в рамках уже существующих программ.
Следующим действием стало преобразование файла Python с тестом программы (файла с расширением .py) в исполняемый файл (файл с расширением .exe). Для этого мне потребовалось установить пакет “Auto Py To Exe” позволяющий удобно преобразовать наш файл. После установки, я вписал команду “auto-py-to-exe” в терминал, и в открывшемся окне я произвёл преобразование Python файла в исполняемый файл.
В результате получилось независимое приложение, которое можно запускать на любом компьютере, распространять в интернете. Я предложил своим знакомым протестировать приложение и оставить отзывы о его работе. (Приложение 2) Получив отзывы, я провел их анализ и обработку и пришёл к выводу, что данный калькулятор действительно полезен, но его функционал можно расширять всё больше и больше. Например, в будущем, можно добавить возведение в любую степень, нахождение обратного пропорционального, вычисление тригонометрических функций. Кроме того, возникла проблема совместимости приложения с операционной системой, что тоже можно рассматривать как задел на будущее.
Рисунок 3. Калькулятор 2.0
Как показывает практика, Python – идеальный язык для новичка. Код на Python легко писать и читать, язык стабильно занимает высокие места в рейтингах популярности, а «питонисты» востребованы почти во всех сферах IT – программировании, анализе данных, системном администрировании и тестировании. YouTube, Intel, Pixar, NASA, VK, Яндекс – вот лишь немногие из известных компаний, которые используют Python в своих продуктах.
Мной была выдвинута гипотеза: при должном изучении теоретического материала новичок-программист может самостоятельно создать исполняемый файл (создать приложение).
Для подтверждения гипотезы и достижения цели проекта, я изучил историю появления и развития языков программирования, подробно изучил историю появления и развития языка программирования Python, создателем которого является голландец Гвидо Ван Россум. Так, я узнал, что версия Python 3.0 является обратно-несовместимой с версией Python 2.*, что в итоге сыграло важную роль в развитии двух независимых ветвей Python-версий.
Изучив разные источники информации в сети Интернет, я определил самые популярные GUI фреймворки на языке программирования Python: Tkinter, Flexx, CEF Python, Dabo, Kivy, Pyforms, PyGObject, PyQt, PySide, PyGUII, libavg, PyGTK и др. Получив первые представления о GUI фреймворках я остановил свой выбор на фреймворке Tkinter.
На следующем этапе я составил алгоритм действий:
1. Освоить графические примитивы Tkinter (Label, Button, Entry, заголовки и тд.).
2. Определиться с направлением будущего приложения (поставить задачу, которую будет выполнять продукт исследования).
3. Написать программу.
4. Произвести отладку программы.
5. Преобразовать файла Python (файл с расширением .py) в исполняемый файл (файл с расширением .exe).
6. Получить отзывы о работе приложения от знакомых для выявления недостатков и достоинств моего приложения по сравнению с другими.
7. Доработка приложения с учетом отзывов.
Выполняя последовательно шаги своего алгоритма, я освоил графические примитивы и определился с направлением будущего приложения. Ещё в 8 классе я заметил, что приложений, решающих квадратные уравнения, я не встречал, а пользоваться сайтами не всегда удобно, и я решил создать портативное приложение, которое можно запустить в любой момент, не тратя время на поиск его в интернете. Таким образом возникла идея совмещения обычного классического окна калькулятора с окном решения квадратных уравнений. После создания приложения я проводил многократные тестирования и занимался отладкой программы. Затем я попросил своих знакомых принять участие в апробации приложения, чтобы получить отзывы и выявить достоинства и недостатки моего проекта.
Таким образом, я считаю, что все поставленные передо задачи выполнены, а цель достигнута. Я, будучи программистом-новичком, смог самостоятельно создать приложение, которое можно распространять среди пользователей, а значит, гипотезу можно также считать подтвержденной.
В дальнейшем планируется доработка приложения и попытка сделать его доступным для пользователей. Так, можно добавить еще целый ряд функций для выполнения (в математике их существует достаточно много), а внешний вид можно также дорабатывать.
Саммерфилд М. Программирование на Python 3. Подробное руковдство – Символ-Плюс, 2009
Байдер Д. Чистый Python. Тонкости программирования для профи – Питер, 2017
Мордкович А.Г. Алгебра. 8 класс. Учебник для общеобразовательных организаций. В 2 ч. Ч1 / А.Г.Мордкович. – 26-е изд., стер. – М. : Мнемозина, 2021. – 223 с. : ил.
Босова, Л. Л. Информатика. 8–9 классы. Начала программирования на языке Python. Дополнительные главы к учебникам / Л. Л. Босова, Н. А. Аквилянов, И. О. Кочер- гин и др. — М. : БИНОМ. Лаборатория знаний, 2020. — 96 с. : ил.
Электронный образовательный ресурс: Welcome to Python.org
Электронный образовательный ресурс: Полный курс по изучению Tkinter + Примеры (python-scripts.com)
Электронный образовательный ресурс: История языка программирования Python — Википедия (wikipedia.org)
Нисчал Н. Python – это просто. Пошаговое руководство про программированию и анализу данных – БХВ, 2022
Текстпрограммы
from tkinter import *
from tkinter import messagebox
import math
import os
def add_digit(digit):
value = calc.get()
if value == '0':
value = value[1:]
calc.delete(0, END)
calc.insert(0, value + str(digit))
def add_dot(digit):
value = calc.get()
if '.' in value:
if '.' not in value[value.find('+') + 1:] or '.' not in value[value.find('-') + 1:] or '.' not in value[value.find('/') + 1:] or '.' not in value[value.find('*') + 1:]:
calc.delete(0, END)
calc.insert(0, value + digit)
else:
calc.delete(0, END)
calc.insert(0, value + digit)
def add_operation(operation):
value = calc.get()
if value[-1] in '-+*/':
value = value[:-1]
elif '+' in value or '-' in value or '/' in value or '*' in value:
calculate()
value = calc.get()
calc.delete(0, END)
calc.insert(0, value + operation)
def calculate():
value = calc.get()
if value[-1] in '+-/*':
value = value + value[:-1]
calc.delete(0, END)
try:
result = eval(value)
if int(result) == result:
result = int(result)
calc.insert(0, result)
except (NameError, SyntaxError):
messagebox.showinfo('Внимание', 'Нужновводитьтолькоцифры!')
calc.insert(0, str(0))
except ZeroDivisionError:
messagebox.showinfo('Внимание!', 'Нанольделитьнельзя!')
calc.insert(0, str(0))
def clear():
calc.delete(0, END)
calc.insert(0, '0')
def sqrt():
value = calc.get()
if value[-1] in '+-/*':
value = value + value[:-1]
calc.delete(0, END)
try:
result = math.sqrt(eval(value))
if int(result) == result:
result = int(result)
calc.insert(0, str(result))
except (NameError, SyntaxError):
messagebox.showinfo('Внимание', 'Нужновводитьтолькоцифры!')
calc.insert(0, str(0))
except ZeroDivisionError:
messagebox.showinfo('Внимание!', 'Нанольделитьнельзя!')
calc.insert(0, str(0))
def power():
value = calc.get()
if value[-1] in '+-/*':
value = value + value[:-1]
calc.delete(0, END)
try:
result = eval(value) ** 2
if int(result) == result:
result = int(result)
calc.insert(0, result)
except (NameError, SyntaxError):
messagebox.showinfo('Внимание', 'Нужновводитьтолькоцифры!')
calc.insert(0, str(0))
except ZeroDivisionError:
messagebox.showinfo('Внимание!', 'Нанольделитьнельзя!')
calc.insert(0, str(0))
def new_win():
os.startfile('Основноеокно.py')
def toplevel():
def find_roots():
try:
a = float(ent_a.get())
b = float(ent_b.get())
c = float(ent_c.get())
d = (b * b) - (4 * a * c)
if d < 0:
ent_comment['state'] = NORMAL
ent_roots['state'] = NORMAL
ent_roots.delete(0, END)
ent_comment.delete(0, END)
ent_comment.insert(0, 'Дискриминантотрицательный')
ent_roots.insert(0, 'Корнейнет')
ent_comment['state'] = DISABLED
ent_roots['state'] = DISABLED
elif d == 0:
x1 = float(-b / (2 * a))
if int(x1) == x1:
x1 = int(x1)
else:
x1 = round(x1, 3)
ent_comment['state'] = NORMAL
ent_roots['state'] = NORMAL
ent_comment.delete(0, END)
ent_roots.delete(0, END)
ent_comment.insert(0, 'Дискриминантравеннулю')
ent_roots.insert(0, f'x1 = {x1}')
ent_comment['state'] = DISABLED
ent_roots['state'] = DISABLED
else:
x1 = float((-b + (d ** (1 / 2))) / (2 * a))
if int(x1) == x1:
x1 = int(x1)
else:
x1 = round(x1, 3)
x2 = float((-b - (d ** (1 / 2))) / (2 * a))
if int(x2) == x2:
x2 = int(x2)
else:
x2 = round(x2, 3)
ent_comment['state'] = NORMAL
ent_roots['state'] = NORMAL
ent_comment.delete(0, END)
ent_roots.delete(0, END)
ent_comment.insert(0, 'Дискриминантположительный')
ent_roots.insert(0, f'x1 = {x1}, x2 = {x2}')
ent_comment['state'] = DISABLED
ent_roots['state'] = DISABLED
except (NameError, ValueError):
messagebox.showinfo('Ошибка!', 'Вводицифры!')
except ZeroDivisionError:
messagebox.showinfo('Ошибка!', 'Аргумент "a" неможетбытьравеннулю!')
def add_lbl(letter):
return Label(win2, text=f'Введитезначение{letter}:', font='Calibri', relief='groove')
def add_comment():
return Label(win2, text='Комментарий:', font='Calibri', relief='groove')
def add_roots():
return Label(win2, text='Корень(ни) уравнения:', font='Calibri', relief='groove')
def add_button():
return Button(win2, text='Найтикорень(ни) уравнения', font='Calibri', relief='groove', bg='lightgrey',
command=lambda: find_roots())
win2 = Tk()
win2.title('Калькуляторквадратныхуравнений')
win2.geometry('435x210+670+300')
win2.resizable(width=False, height=False)
lbl_info = Label(win2, text='Приведённоеквадратноеуравнениеимеетвид: ax^2+bx+c=0', font='Calibri',
relief='groove')
lbl_info.grid(row=0, column=0, stick='we', columnspan=2, padx=2, pady=2)
add_lbl("a").grid(row=1, column=0, stick='we', padx=2, pady=2)
add_lbl("b").grid(row=2, column=0, stick='we', padx=2, pady=2)
add_lbl('c').grid(row=3, column=0, stick='we', padx=2, pady=2)
add_comment().grid(row=4, column=0, stick='we', padx=2, pady=2)
add_roots().grid(row=5, column=0, stick='we', padx=2, pady=2)
ent_a = Entry(win2)
ent_a.grid(row=1, column=1, stick='we')
ent_b = Entry(win2)
ent_b.grid(row=2, column=1, stick='we')
ent_c = Entry(win2)
ent_c.grid(row=3, column=1, stick='we')
ent_comment = Entry(win2, state=DISABLED, )
ent_comment.grid(row=4, column=1, stick='we', )
ent_roots = Entry(win2, state=DISABLED)
ent_roots.grid(row=5, column=1, stick='we')
add_button().grid(row=6, column=0, columnspan=2, stick='we', pady=2, padx=2)
def make_digit_button(digit):
return Button(text=digit, bd=5, font=('Arial', 13), command=lambda: add_digit(digit))
def make_dot_button(digit):
return Button(text=digit, bd=5, font=('Arial', 13), command=lambda: add_dot(digit))
def make_operation_button(operation):
return Button(text=operation, bd=5, font=('Arial', 13), fg='red',
command=lambda: add_operation(operation))
def make_calc_button(operation):
return Button(text=operation, bd=5, font=('Arial', 13), fg='red',
command=calculate)
def make_clear_button(operation):
return Button(text=operation, bd=5, font=('Arial', 13), fg='red',
command=clear)
def make_sqrt_button(operation):
return Button(text=operation, bd=5, font=('Arial', 13), fg='red',
command=sqrt)
def make_power_button(operation):
return Button(text=operation, bd=5, font=('Arial', 13), fg='red',
command=power)
def make_quadratic_button(operation):
return Button(text=operation, bd=5, font=('Arial', 13), fg='red',
command=toplevel)
win = Tk()
win.geometry('300x265+350+300')
win.title('Калькулятор')
win.resizable(width=False, height=False)
win['bg'] = 'indigo'
win.bind('<Key>', )
calc = Entry(win, justify=RIGHT, font='Arial, 15', width=10, )
calc.insert(0, '0')
calc.grid(row=0, column=0, columnspan=5, stick='we', padx=5)
make_digit_button(1).grid(row=1, column=0, stick='wens', padx=5, pady=5)
make_digit_button(2).grid(row=1, column=1, stick='wens', padx=5, pady=5)
make_digit_button(3).grid(row=1, column=2, stick='wens', padx=5, pady=5)
make_digit_button(4).grid(row=2, column=0, stick='wens', padx=5, pady=5)
make_digit_button(5).grid(row=2, column=1, stick='wens', padx=5, pady=5)
make_digit_button(6).grid(row=2, column=2, stick='wens', padx=5, pady=5)
make_digit_button(7).grid(row=3, column=0, stick='wens', padx=5, pady=5)
make_digit_button(8).grid(row=3, column=1, stick='wens', padx=5, pady=5)
make_digit_button(9).grid(row=3, column=2, stick='wens', padx=5, pady=5)
make_digit_button(0).grid(row=4, column=0, stick='wens', padx=5, pady=5)
make_dot_button('.').grid(row=4, column=1, stick='wens', padx=5, pady=5)
make_operation_button('+').grid(row=1, column=3, stick='wens', padx=5, pady=5)
make_operation_button('-').grid(row=2, column=3, stick='wens', padx=5, pady=5)
make_operation_button('*').grid(row=3, column=3, stick='wens', padx=5, pady=5)
make_operation_button('/').grid(row=4, column=3, stick='wens', padx=5, pady=5)
make_calc_button('=').grid(row=4, column=4, stick='wens', padx=5, pady=5)
make_clear_button('C').grid(row=4, column=2, stick='wens', padx=5, pady=5)
make_sqrt_button('√').grid(row=1, column=4, stick='wens', padx=5, pady=5)
make_power_button('x²').grid(row=2, column=4, stick='wens', padx=5, pady=5)
make_quadratic_button('⋙').grid(row=3, column=4, stick='wens', padx=5, pady=5)
win.grid_columnconfigure(0, minsize=60)
win.grid_columnconfigure(1, minsize=60)
win.grid_columnconfigure(2, minsize=60)
win.grid_columnconfigure(3, minsize=60)
win.grid_columnconfigure(4, minsize=60)
win.grid_rowconfigure(1, minsize=60)
win.grid_rowconfigure(2, minsize=60)
win.grid_rowconfigure(3, minsize=60)
win.grid_rowconfigure(4, minsize=60)
win.mainloop()
Приложение 2
Отзывы знакомых после тестирования приложения «Калькулятор 2.0.»