Как узнать размер текста в пикселях python

Обновлено: 06.07.2024

Из вывода видно, что размер изображения, считываемого Img, равен (ширина, высота) изображения; в то время как размер изображения (высота, ширина, канал), [Вот почему caffe необходимо установить в коде при отдельном тестировании: transformer.set_transpose ('data', (2,0,1)), потому что формат данных изображения, которое может обрабатывать caffe, - (канал, высота, ширина ), поэтому данные необходимо преобразовать]

Изображение, считанное Img, получает пиксель определенной точки с помощью getpixel ((w, h)), чтобы напрямую вернуть значение пикселя трех каналов этой точки
Изображение, считанное с помощью skimage, можно получить непосредственно из img_file2 [0] [0], но вы должны помнить его формат, а не то, что вы думаете (канал, высота, ширина)

Если мы хотим узнать некоторую информацию об изображении

Изображение PIL Для просмотра информации об изображении можно использовать следующие методы

Чтобы использовать Python для обработки цифровых изображений, необходимо установить пакет Pillow. Хотя Python поставляется с PIL (библиотека изображений python), эта библиотека перестала обновляться, поэтому используйте Pillow, разработанную на основе PIL.

Типы изображений, с которыми может работать пилот
pil может обрабатывать растровые изображения (блоки данных пикселей).

проход
Изображение может содержать один или несколько каналов данных. Если эти каналы имеют одинаковый размер и глубину, Pil позволяет накладывать эти каналы.

координировать
Pil принимает систему координат (0,0) в верхнем левом углу.

Хотя Pillow используется, это ответвление PIL, поэтому импортируйте его из PIL. Используйте функцию open (), чтобы открыть изображение, и функцию show (), чтобы отобразить изображение.

Этот метод отображения изображений заключается в вызове браузера изображений, поставляемого с операционной системой, для открытия изображения. Иногда этот метод неудобен, поэтому мы также можем использовать другой метод, чтобы программа могла нарисовать изображение.

Хотя этот метод более сложен, его рекомендуется использовать. Он использует библиотеку matplotlib для рисования изображений для отображения. matplotlib - это профессиональная библиотека для рисования, которая эквивалентна графику в Matlab.Вы можете установить несколько фигур, задать заголовок рисунка и даже использовать подзаголовок для отображения нескольких изображений на одном рисунке. matplotlib можно установить напрямую.
По умолчанию фигура поставляется с осью, если в этом нет необходимости, мы можем отключить ее

Подпись к изображению

Изображение PIL Для просмотра информации об изображении можно использовать следующие методы

Всего одна строчка кода, очень просто. Эта строка кода может не только сохранить изображение, но и преобразовать формат.В этом примере исходное изображение png сохраняется как изображение jpg.

Цветное изображение в оттенках серого

Используйте функцию convert () для преобразования. Это метод объекта экземпляра изображения. Он принимает параметр режима, чтобы указать режим цвета. Значение режима может быть следующим:

Разделение каналов и слияние

Кадрирование снимка

Интересующая область (roi) обрезается из исходного изображения.Область кадрирования определяется 4-кортежем, а информация в кортеже (левый, верхний, правый, нижний). Начало (0, 0) системы слева от подушки - это верхний левый угол изображения. Единица измерения координат - пиксель.

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

** Геометрическая трансформация **
Класс изображения имеет методы resize (), rotate () и transpose () для геометрического преобразования.
Масштабирование и поворот изображения

Конвертировать изображение

Нет разницы в производительности между transpose () и rotate ().

Модуль изображений библиотеки обработки изображений Python

Создать новую картинку

Сложенные изображения
Сложите два изображения, img2 и img2, альфа - это число с плавающей запятой между [0,1], если оно равно 0, эффект img1, если он равен 1.0, эффект img2. Конечно, размер и режим img1 и img2 должны быть одинаковыми. Эта функция может дать очень красивый эффект, и арифметическое сложение и вычитание графики будет упомянуто позже.

Composite может использовать другое изображение в качестве маски, все три изображения должны иметь одинаковый размер, а режим изображения маски может быть «1», «L», «RGBA».

Добавить текстовый водяной знак

Добавить небольшой водяной знак

Преобразование изображения PIL в массив numpy

numpy image Для просмотра информации об изображении можно использовать следующие методы

Преобразование массива numpy в изображение PIL
Здесь matplotlib.image используется для чтения массива изображений. Обратите внимание, что считанный здесь массив имеет тип float32 с диапазоном 0-1, а данные PIL.Image имеют тип uinit8 с диапазоном 0-255., Итак, чтобы преобразовать:

Изображение PIL Для просмотра информации об изображении можно использовать следующие методы

В некоторых из предыдущих примеров мы все использовали Image.open () для открытия изображения, а затем напрямую управляли объектом PIL. Ничего страшного, если это простая операция, но если операция немного сложнее, она будет более трудоемкой. Поэтому обычно после загрузки изображения мы конвертируем изображение в матрицу для более сложных операций.
Откройте изображение, преобразуйте его в матрицу и отобразите

Объект PIL можно преобразовать в объект массива, вызвав функцию array () в numpy.

Изображение PIL Для просмотра информации об изображении можно использовать следующие методы

numpy image Для просмотра информации об изображении можно использовать следующие методы

Если это изображение RGB, то после преобразования в массив оно становится строкамиcolsтрехмерная матрица каналов, поэтому мы можем использовать

Чтобы получить доступ к значению пикселя.
Пример 1. Откройте изображение и случайным образом добавьте немного соли и перца.

Пример 2: преобразовать изображение lena в бинаризацию, значение пикселя больше 128 становится 1, в противном случае оно становится 0

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

Можно управлять не только каждым пикселем, но и каждым каналом независимо. Например, увеличить яркость каждого пикселя (не знаю, есть ли более профессиональные слова) на 20%.

Давайте сначала посмотрим на две функции reshape и flatten:

Предположим, мы сначала сгенерировали одномерный массив:

Если мы хотим превратить этот одномерный массив в двумерную матрицу 3 * 5, мы можем использовать изменение формы для достижения

Теперь, если мы вернемся и узнаем, что двумерная матрица должна быть преобразована в одномерный массив, мы не сможем использовать reshape, мы можем использовать только flatten. Давайте посмотрим на разницу между двумя

Видно, что преобразование с reshape на самом деле представляет собой двумерный массив с двумя квадратными скобками, поэтому можно использовать только flatten.

Если мы хотим найти гистограмму изображения, нам нужно сгладить матрицу изображения, чтобы сделать ее одномерным массивом, а затем выполнить статистику

Нарисуйте гистограмму в оттенках серого
Рисование может быть выполнено путем вызова библиотеки matplotlib.pyplot, а функция hist может рисовать гистограмму напрямую.
Как позвонить:

Существует много параметров hist, но обычно используются эти пять, требуется только первый, а последние четыре необязательны.

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

Метод вызова

Вы можете использовать модуль ImageEnhance, который содержит большое количество предопределенных методов улучшения изображения.
Средство улучшения включает цветовой баланс, баланс яркости, контраст, резкость и т. д. Используя эти усилители, вы можете легко выполнять такие операции, как регулировка цвета, регулировка яркости, повышение резкости и т. Д., А также реализовать некоторые базовые функции улучшения изображения, предоставляемые в google picasa.

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

Затем вы можете использовать метод улучшения (коэффициента) для настройки.

Повышение яркостиИспользуется для настройки баланса света и темноты изображения.

factor = 1 возвращает объект черного изображения, 0 возвращает объект исходного изображения

Увеличение контрастности контрастИспользуется для настройки контрастности изображения, что эквивалентно настройке контрастности цветного телевизора.

Резкость усиливает резкостьИспользуется для увеличения резкости / пассивирования изображений.

Следует отметить, что коэффициент операции повышения резкости представляет собой число с плавающей запятой 0-2. Когда factor = 0, возвращается полностью размытый объект изображения. Когда factor = 1, возвращается полностью резкость объекта изображения, factor = 1 Когда вернуть исходный объект изображения

Этот модуль в основном включает арифметические операции с изображениями, называемые операциями каналов. Этот модуль можно использовать по-разному, включая создание некоторых специальных эффектов, интеграцию изображений, арифметическое рисование и так далее.
Invert:

Инверсный цвет изображения аналогичен дополнительному, установленному в операции задания. Максимальное значение - Макс. Каждый пиксель вычитается, чтобы получить инверсный цвет.
формула

lighter:

darker:

difference

Вычислить абсолютное значение двух изображений и выполнить вычитание пикселя за пикселем.
multiply

Наложите два изображения друг на друга. Если вы используете чистый черный цвет, чтобы перекрыть определенное изображение, вы получите чисто черное изображение. Если вы используете чистый белый цвет для наложения изображения, изображение не пострадает.
Формула расчета выглядит следующим образом

screen:

Сначала инвертируйте цвет, затем наложите.
формула

add:

Выполните арифметическое сложение двух картинок и рассчитайте по следующей формуле
формула

Если масштаб и смещение игнорируются, масштаб = 1,0, смещение = 0,0 означает
out = img1 + img2
subtract:

Выполните арифметическое вычитание на двух картинках:
формула

ImageFilter - это модуль фильтра PIL. С помощью этих предопределенных фильтров вы можете легко выполнять некоторые операции фильтрации на изображении, тем самым удаляя шум в изображении (частичное устранение), что может снизить сложность будущей обработки (например, распознавания образов). Подождите).

Чтобы использовать функцию фильтра PIL, вам необходимо ввести модуль ImageFilter

Я могу получить высоту и ширину символа в пикселях с помощью PIL (см. ниже), но (если я не ошибаюсь) размер пикселя зависит от экрана DPI, который может меняться. Вместо этого я хотел бы рассчитать ширину символа в абсолютных единицах, таких как дюймы или 1200-е дюймы ( "словарные единицы" ).

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

Я понимаю, что я не совсем понимаю взаимосвязь между пикселями и разрешением экрана и размерами шрифтов. Неужели я все это делаю неправильно?

Ширина текстового текста обычно вычисляется в точках типографства, но поскольку точка с целью определения шрифтов определяется как 1/72 из дюйм, вы можете легко преобразовать его в любой другой блок.

Чтобы получить ширину дизайна символа (выраженный в единицах em), вам нужен доступ к низкоуровневым данным шрифта. Самый простой способ - pip install fonttools , в котором есть все, чтобы работать на минимально возможном уровне определений шрифтов.

С установкой fontTools вы можете:

    загрузить данные шрифта - для этого требуется путь к фактическому файлу шрифта;

Ширины символов хранятся в виде ширины глифов, что означает, что вы должны получить отображение "символ-к-глифу"; это находится в таблице cmap шрифта:

а. загрузите cmap для вашего шрифта. Наиболее полезной является карта Юникода - шрифт может содержать другие.
б. загрузите глиф, установленный для вашего шрифта. Это список имен глифов в этом шрифте.

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

Это приводит к этой функции:

и является правильным в сравнении с тем, что сообщает Adobe InDesign. (Обратите внимание, что кернинг для каждого персонажа здесь не применяется! Это потребует гораздо большего кода.)

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

Приведение в float в функции getTextWidth заключается в том, что это работает как с Python 2.7, так и с 3.5, но обратите внимание, что если вы используете символы Unicode Python 2.7 и более крупные (не простые ASCII), вам необходимо переписать чтобы правильно использовать символы UTF8.

Я хочу знать весь размер (включая высоту и ширину) строки some text на холсте черепашьей графики.
Как я могу это сделать?

3 ответа

Я хотел бы получить цвет конкретного пикселя в Python, используя его координаты X Y, возможно ли это? Это в Windows, если это имеет значение.

Размер шрифта говорит вам только половину того, что вам нужно знать, т. Е. Высоту:

Размер шрифта обычно принимается за расстояние от верхней части самого высокого символа до нижней части самого низкого символа.

Но мы можем получить ширину, установив параметр move= от turtle.write() до True . Вот пример, где я хочу нарисовать рамку вокруг текста, который я только что нарисовал:

enter image description here

Теперь вот пример, который сначала рисует поле, заполняет его, а затем рисует в него текст:

enter image description here

Я работаю в черепашьей графике, чтобы воссоздать этот паттерн: Это, вероятно, очень простой вопрос, но есть ли более простой способ для меня создать этот повернутый квадрат внутри квадратной формы? Как бы то ни было, я просто использую одну черепаху, чтобы сделать нормальный квадрат, а затем.

Как я могу сказать черепахе, чтобы она повернулась лицом к направлению в черепашьей графике? Я хотел бы, чтобы черепаха повернулась лицом к направлению, независимо от ее первоначального положения, как я могу этого достичь?

Высота и ширина текста зависят от параметра font .

Хотя Брэндон в значительной степени дал ответ, позвольте мне привести вам пример:

Похожие вопросы:

Я хотел бы узнать ширину TD , которая определила style='width: 200px; , но текст делает его длиннее (без перерыва). Я хочу узнать эффективную ширину и, пока она больше 200 пикселей, каждый раз.

Как нарисовать эллипс / овал в черепашьей графике (python)? Я хочу иметь возможность нарисовать эллипс и часть эллипса, используя функцию circle() или что-то подобное. Я могу штамповать один из них.

Я использую ggpairs() в пакете GGally . График пар состоит из четырех непрерывных переменных, и я дал другой столбец, фактор с 2 уровнями, аргументу colour , который работал очень хорошо, как.

Я хотел бы получить цвет конкретного пикселя в Python, используя его координаты X Y, возможно ли это? Это в Windows, если это имеет значение.

Я работаю в черепашьей графике, чтобы воссоздать этот паттерн: Это, вероятно, очень простой вопрос, но есть ли более простой способ для меня создать этот повернутый квадрат внутри квадратной формы.

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

Мне нужен способ перевести размер точки и размер пикселя между несколькими платформами. У меня есть приложение Qt, которое должно работать на мультиплатформенной платформе, включая встроенный Linux.

Я пытаюсь узнать размер пикселя текста (с максимальной длиной) в DataGridTextColumn в WPF, используя шаблон MVVM, чтобы установить минимальную ширину DataGridTextColumn . Может ли кто-нибудь помочь.

Виджет Тext предоставляет расширенные возможности, которые позволяют редактировать многострочный текст и форматировать способ его отображения, например изменять его цвет и шрифт.

Вы также можете использовать элегантные структуры, такие как вкладки и метки, чтобы найти определенные разделы текста и применить изменения к этим областям. Кроме того, вы можете вставлять окна и изображения в текст, потому что этот виджет был разработан для обработки как простого, так и отформатированного текста.

где master - ссылка на родительское окно, а options - набор следующих параметров:

  • bg: цвет фона по умолчанию для текстового виджета.
  • bd: ширина границы вокруг текстового виджета. По умолчанию 2 пикселя.
  • font: шрифт по умолчанию для текста, вставляемого в виджет.
  • fg: цвет, используемый для текста (и растровых изображений) в виджете. Вы можете изменить цвет для помеченных регионов; эта опция только по умолчанию.
  • height: высота виджета в строках (не в пикселях!), измеренная в соответствии с текущим размером шрифта.
  • padx: размер внутреннего отступа, добавляемый слева и справа от текстовой области. По умолчанию используется один пиксель.
  • pady: размер внутреннего отступа, добавляемый над и под текстовой областью. По умолчанию используется один пиксель.
  • selectbackground: цвет фона для отображения выбранного текста.
  • selectborderwidth: ширина границы для использования вокруг выделенного текста.
  • spacing1: эта опция указывает, сколько дополнительного вертикального пространства помещается над каждой строкой текста. Если строка переносится, это пространство добавляется только перед первой строкой, которую она занимает на дисплее. По умолчанию 0.
  • spacing2: этот параметр указывает, сколько дополнительного вертикального пространства необходимо добавить между отображаемыми строками текста при переносе логической строки. По умолчанию 0.
  • spacing3: эта опция указывает, сколько дополнительного вертикального пространства добавляется ниже каждой строки текста. Если строка переносится, это пространство добавляется только после последней строки, которую оно занимает на дисплее. По умолчанию 0.
  • state: обычно текстовые виджеты реагируют на события клавиатуры и мыши; установить state=NORMAL , чтобы получить это поведение. Если вы установите state=DISABLED , текстовый виджет не будет отвечать, и вы не сможете изменять его содержимое программным способом.
  • width: ширина виджета в символах (не в пикселях!), измеренная в соответствии с текущим размером шрифта.
  • wrap: эта опция управляет отображением слишком широких линий. Установите wrap=WORD , и он будет разбивать строку после последнего слова, которое будет соответствовать. При поведении по умолчанию, wrap=CHAR , любая слишком длинная строка будет разбита на любой символ.
  • xscrollcommand: чтобы сделать текстовый виджет горизонтально прокручиваемым, установите этот параметр для метода set() горизонтальной полосы прокрутки.
  • yscrollcommand: чтобы сделать текстовый виджет вертикально прокручиваемым, установите этот параметр для метода set() вертикальной полосы прокрутки.

Text имеет следующие методы:

  • delete(startindex [,endindex]) - метод удаляет определенный символ или диапазон текста.
  • get(startindex [,endindex]) - метод возвращает определенный символ или диапазон текста.
  • index(index) - возвращает абсолютное значение индекса на основе данного индекса.
  • insert(index [,string]. ) - метод вставляет строки в указанное местоположение индекса.
  • selection_get() - метод возвращает выделенный текст.

Индексы можно указывать ключевыми словами:

  • SEL_FIRST , SEL_LAST - при выделении текста указывает на начало и конец позиций выделенного фрагмента.
  • INSERT - место расположение курсора
  • END - конец текста
  • указывая число: 1.0 , где 1 - указания номера стоки, а 0 - указание номера символа в строке.

Напишите программу с текстовым полем растягивающимся на всё окно. Проверьте правильность работы растяжения изменяя размер окна.

Напишите программу с текстовым полем и кнопкой Add . При нажатии на кнопку происходит добавление текста в текстовое поле: "This is a new text!"

Напишите программу с текстовым полем и кнопками:

  • Copy all - при нажатии на которую, происходит копирование всего текста,
  • Paste - при нажатии на которую, происходит добавление скопированного текста.

Напишите программу с текстовым полем и кнопками:

  • Copy all - при нажатии на которую, происходит копирование всего текста,
  • Copy - при нажатии на которую, происходит копирование выделенного текста,
  • Paste - при нажатии на которую, происходит добавление скопированного текста в место расположения курсора.

Напишите программу с текстовым полем и кнопками Copy , Cut и Paste :

  • Copy - при нажатии, происходит копирование выделенного текста;
  • Cut - при нажатии, происходит вырезание выделенного текста в буфер;
  • Paste - при нажатии, происходит добавление скопированного текста в место расположения курсора.

Напишите программу с текстовым полем и кнопками "Capitalize","Lower", "Upper" и "Title". Нажатие кнопок форматирует выделенный пользователем текст:

  • нажатие "Capitalize": в выделенном тексте первая буква становиться заглавная, остальные маленькие;
  • нажатие "Lower": в выделенном тексте все буквы становятся строчными (маленькими);
  • нажатие "Upper": в выделенном тексте все буквы становятся заглавными (большими);
  • нажатие "Title": в выделенном тексте первая буква каждого слова становится заглавная.

Напишите программу с текстовым полем, кнопкой "Get status" и строкой состояния, виджеты должны масштабироваться под размер окна. Обновления статуса происходит при нажатии кнопки. В стоке состояния вывести информацию:

  • общее количество символов (функция len() - возвращает длину строки),
  • общее количество строк,
  • номер строки, в которой находиться курсор,
  • номер символа в строке, в которой находиться курсор.

Пример строки состояния можно подсмотреть в текстовом редакторе, например "Блокнот":

Напишите программу с текстовым полем и кнопкой <- BackSpace . При нажатии на кнопку будет удаляться последний напечатанный символ, с учетом места расположения курсора.


Штош. Дописываем калькулятор. Если вы не читали прошлую статью, я вам настоятельно рекомендую это сделать.

Добавляем отрицание

Логика проста: если отрицания нет в поле, значит добавляем. Иначе убираем левый символ с помощью среза [1:]. Не забываем ввести дополнительное условие для нуля.

Возникает такая проблемка: при максимальной длине отрицание вытесняет последнюю цифру. Так работать, конечно же, не должно.

Давайте добавим в конструктор переменную максимальной длины поля ввода. Взять её можно с помощью метода maxLength.

Если длина строки больше этой переменной на единицу и в строке есть отрицание, то ставим максимальную длину поля больше на единицу. Иначе ставим обратно дефолтную максимальную длину.

Backspace

Когда длина поля равна 1 , нажатие на Backspace ставит в поле 0 . Еще он ставит 0 , когда в поле есть одна цифра с отрицанием. Во всех остальных случаях кнопка Backspace обрезает последний правый символ.

Удаляем равенство из Label

Когда во временном выражении есть равенство, следующая нажатая кнопка должна удалять его из лейбла.

Но удалять должна не любая кнопка, а цифра, точка, отрицание, Backspace и очищение поля ввода.

Обрабатываем исключения

При нажатии на кнопку "равно", когда во временном выражении уже есть равенство, программа выкидывает KeyError.

Добавим в функцию вычисления конструкцию try-except. Вообще, в калькуляторе Windows оно продолжает считать, но у нас будет лучше - у нас ничего не будет происходить.

Куда же без ошибки деления на ноль - ZeroDivisionError. Напишем 2 переменные с текстом для показа ошибки.

Напишем метод для показа ошибки, передадим в него текст. Сначала ставим максимальную длину поля, равную длине текста ошибки, а затем уже ставим сам текст.

Когда в лейбле есть 0 / , деление вызывает TypeError.

Убираем ошибки

Если текст в поле равен какой-то ошибке, то ставим максимальную длину поля обратно к дефолтному значению и ставим текст 0

Убирать ошибку нужно в начале методов добавления цифры, backspace и очищения полей. Почему только они? Мы заблокируем кнопки знаков, точки и отрицания.

Блокируем кнопки

Для этого существует метод setDisabled, в который нужно передавать логическую переменную: чтобы заблокировать - True, а чтобы включить - False.

Блокируем кнопки в конце метода показа ошибки.

Смотрите, на кнопки нельзя кликнуть, но по интерфейсу так сразу и не скажешь, пока не наведёшь. Нужно сделать текст кнопок серым.

Меняем цвет кнопок

Напишем метод изменения цвета кнопок. Мы будем передавать в него css строку с цветом.


Включаем кнопки

Передаем логическую переменную в метод блокировки и ставим её же в setDisabled для кнопок.

Еще нужно вернуть кнопкам белый цвет.

Проставим в методы показа и удаления ошибки.

Регулируем размер шрифта

Для начала введем 2 переменные с размерами шрифтов:

Теперь создадим методы получения ширины текста в пикселях для поля и лейбла:

Регулируем размер шрифта в поле ввода. Пока ширина текста больше ширины окна (-15, так будет лучше), мы уменьшаем размер шрифта на единицу.

Нужно проставить этот метод после любого изменения длины текста в поле ввода.

Ставим после self.ui.le_entry.setText*

Мы только уменьшаем размер шрифта, нужно его еще увеличивать при уменьшении ширины текста и увеличении ширины окна.

Пока ширина текста меньше ширины поля (-60, так будет лучше), увеличиваем размер шрифта, но не больше дефолтного значения.

Как регулировать размер шрифта при изменении ширины окна приложения? Очень просто, нужно использовать встроенный resizeEvent:

Регулируем размер шрифта во временном выражении

То же самое проворачиваем для временного выражения.

Полный код метода

Ставим после self.ui.lbl_temp.setText* и self.ui.lbl_temp.clear()

Делаем код немного компактнее

Вообще это можно было сделать в самом начале, но мы сделаем в самом конце.

Заменим во всем коде:

self.ui.le_entry на self.entry

self.ui.lbl_temp на self.temp

Введем 2 переменные для поля и временного выражения в конструкторе класса:

Проблема с вычислениями вещественных чисел

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


Все дело в том, что вещественные числа не могут быть точно представлены из-за особенностей их реализации в двоичном виде. Если вы заинтересовались темой, вы можете посмотреть про арифметику вещественных чисел и про стандарт 754.

Ну а как бороться с этой проблемой? Можно использовать модуль decimal, вот пример его работы:

Вот вам и задача со звездочкой, переделайте вычисления калькулятора с этим модулем.

Заключение

Конечно, можно найти еще уйму изъянов в работе калькулятора, но я и не претендую заменить системный. Зачем? Я думаю, получилось вполне неплохо относительно уже существующих туториалов на калькуляторы в интернетах, и надеюсь, что помог вам с изучением этого змеиного языка.

Читайте также: