Обновить

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

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели8.8K
Всего голосов 11: ↑5 и ↓6-1
Комментарии20

Комментарии 20

а теперь перепишите это на фреймворке Kivy - и программа у вас превратится в жар птицу (по красоте) и ее даже можно будет без особых переделок запускать на Android.

Хорошо, вот на Delphi:

procedure TFormMain.ButtonCalcClick(Sender: TObject);
begin
  var A := EditA.Text.ToDouble;
  var B := EditB.Text.ToDouble;
  var C := EditC.Text.ToDouble;

  var Discriminant := Power(B, 2) - 4 * A * C;

  if Discriminant > 0 then
  begin
    var X1 := (-B + Sqrt(Discriminant)) / (2 * A);
    var X2 := (-B - Sqrt(Discriminant)) / (2 * A);
    MemoResult.Text := Format('x1 = %f'#13#10'x2 = %f', [X1, X2]);
  end
  else
    MemoResult.Text := 'Уравнение не имеет действительных корней';
end;

procedure TFormMain.ButtonCalcIncompClick(Sender: TObject);
begin
  var A := EditIncompA.Text.ToDouble;
  var B := EditIncompB.Text.ToDouble;

  var X := -(B / A);
  MemoResultIncomp.Text := Format('x = %f', [X]);
end;

Это весь код, что я написал. На Андроид, Мак, Линукс и Иос тоже запустится

А ты тоже школьник? Dephi с торрентов? На всех, тобой перечисленных OS, тестил? Где у тебя файл с описанием GUI? Сколько "весит" бинарник этого твоего "на Deplhi"?

Не школьник.

Delphi имеет бесплатную Community версию. У меня вообще платная.

На всех указанных OS это будет работать.

Собрать могу хоть сейчас на все платформы на одной машине.

Файл с описанием GUI трогать не надо, это всегда автогенерация. Его пишет сама среда разработки. Ты визуально конструируешь UI.

Ехе весит около 15мб. Не имея никаких зависимостей. На других платформах - также (но Линукс требует gtk).

Упрощу вопрос. Зачем ты привёл своё решение на Delphi? Что хотел показать этим?

Интересно, как такой “графический hello world” сейчас, на текущее время

  • можно реализовать на разных языках, что получается,

  • какие возможности кроссплатформенности

  • как выглядит исходный текст

  • насколько быстро это можно реализовать

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

15мб хелоуворлд бгг. 1кб это должно весить, и работать на любой платформе начиная как минимум с винХП.

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Калькулятор квадратных уравнений</title>

<style>
    * {
        box-sizing: border-box;
        font-family: "Segoe UI", sans-serif;
    }

    body {
        margin: 0;
        min-height: 100vh;
        display: flex;
        justify-content: center;
        align-items: center;
        background: #1e1e1e;
        color: white;
    }

    .window {
        width: 900px;
        background: #252525;
        border-radius: 12px;
        padding: 18px;
        box-shadow: 0 0 25px rgba(0,0,0,0.4);
    }

    .title {
        display: flex;
        align-items: center;
        gap: 10px;
        margin-bottom: 18px;
        font-size: 20px;
        font-weight: 600;
    }

    .logo {
        width: 28px;
        height: 28px;
        border-radius: 50%;
        background: #b32025;
        display: flex;
        align-items: center;
        justify-content: center;
        font-weight: bold;
    }

    .content {
        display: flex;
        gap: 20px;
    }

    .card {
        flex: 1;
        background: #2c2c2c;
        border-radius: 12px;
        padding: 18px;
    }

    .card h2 {
        margin-top: 0;
        margin-bottom: 18px;
        font-size: 22px;
        font-weight: 500;
    }

    .input-group {
        position: relative;
        margin-bottom: 14px;
    }

    .input-group input {
        width: 100%;
        padding: 14px 45px 14px 14px;
        border: 1px solid #555;
        border-radius: 6px;
        background: #3a3a3a;
        color: white;
        font-size: 18px;
        outline: none;
    }

    .input-group span {
        position: absolute;
        right: 14px;
        top: 50%;
        transform: translateY(-50%);
        color: #bdbdbd;
        font-size: 18px;
    }

    button {
        width: 100%;
        padding: 14px;
        border: none;
        border-radius: 6px;
        background: #59c6f4;
        color: black;
        font-size: 18px;
        cursor: pointer;
        transition: 0.2s;
        margin-bottom: 16px;
    }

    button:hover {
        background: #71d3fb;
    }

    .result {
        min-height: 90px;
        background: #3a3a3a;
        border: 1px solid #555;
        border-radius: 6px;
        padding: 14px;
        font-size: 20px;
        line-height: 1.6;
        white-space: pre-line;
    }
</style>
</head>

<body>

<div class="window">

    <div class="title">
        <div class="logo">D</div>
        Калькулятор квадратных уравнений
    </div>

    <div class="content">

        <!-- Полное квадратное -->
        <div class="card">

            <h2>Квадратные уравнения</h2>

            <div class="input-group">
                <input type="number" id="a" value="-4">
                <span>A</span>
            </div>

            <div class="input-group">
                <input type="number" id="b" value="5">
                <span>B</span>
            </div>

            <div class="input-group">
                <input type="number" id="c" value="6">
                <span>C</span>
            </div>

            <button onclick="solveQuadratic()">Решить</button>

            <div class="result" id="quadraticResult"></div>

        </div>

        <!-- Неполное -->
        <div class="card">

            <h2>Квадратные неполные уравнения</h2>

            <div class="input-group">
                <input type="number" id="na" value="-1">
                <span>A</span>
            </div>

            <div class="input-group">
                <input type="number" id="nb" value="5">
                <span>B</span>
            </div>

            <button onclick="solveSimple()">Решить</button>

            <div class="result" id="simpleResult"></div>

        </div>

    </div>

</div>

<script>

function solveQuadratic() {

    let a = parseFloat(document.getElementById('a').value);
    let b = parseFloat(document.getElementById('b').value);
    let c = parseFloat(document.getElementById('c').value);

    let d = b * b - 4 * a * c;

    let result = '';

    if (d < 0) {
        result = 'Нет действительных корней';
    }
    else if (d === 0) {
        let x = (-b / (2 * a)).toFixed(2);
        result = `x = ${x}`;
    }
    else {
        let x1 = ((-b - Math.sqrt(d)) / (2 * a)).toFixed(2);
        let x2 = ((-b + Math.sqrt(d)) / (2 * a)).toFixed(2);

        result = `x1 = ${x1}\nx2 = ${x2}`;
    }

    document.getElementById('quadraticResult').innerText = result;
}

function solveSimple() {

    let a = parseFloat(document.getElementById('na').value);
    let b = parseFloat(document.getElementById('nb').value);

    if (a === 0) {
        document.getElementById('simpleResult').innerText = 'A не может быть 0';
        return;
    }

    let x = Math.sqrt(-b / a);

    if (isNaN(x)) {
        document.getElementById('simpleResult').innerText = 'Нет решения';
    } else {
        document.getElementById('simpleResult').innerText =
            `x = ${x.toFixed(2)}`;
    }
}

solveQuadratic();
solveSimple();

</script>

</body>
</html>

У тебя это просто текст и он не запустится нигде без специальной программы. Вообще нигде и никогда.

Другие ОС
Android
Android
Linux (Ubuntu)
Linux (Ubuntu)
Среда. Дизайнер (код окна трогать не надо)

Я знаю, что такое Delphi. C четвёртой по седьмую версию пользовался довольно активно и даже деньги зарабатывал этим. Но раз уж ты осилил скриншоты, дай ссылку на .apk и бинарник для Linux. Сильно интересно стало, насколько это действительно кросплатформенно.

Вообще не уровень хабра. Да и цель статьи не понятна. Если хотели научить аудиторию использовать tkinter, то зачем описывать, как в питоне импортируются пакеты, и что означает else? Если хотели обучить синтаксису питона, то этого явно мало, да и пример для обучения выбран не самый показательный.

автору 15-16 лет. и он уже имеет грамотную речь, умение описывать свои идеи, доводить их до реализации и описывать результат.
я технические знания придут


Можешь глянуть, я тут что-то похожее делал - только там вообще все решить можно

А что за дичь с "неполными" квадратными уравнениями? Это же просто частные случаи, когда один или несколько коэффициентов равны нулю. Вот только, если a == 0,то уравнение перестаёт быть квадратным, а если a == b == 0, то оно перестаёт быть уравнением и становится равенством, только в одном случае истинным, а в остальных ложным. И все это можно запрограммировать без лишних полей ввода. Просто не вводим коэффициенты, если их нет. Корни, кстати, тоже можно представить не в виде одной-двух переменных, а иначе, более универсально.

Я понял. Теперь дети пишут свои потуги в виде статей на Хабре. Вот это уровень, вот это мы приехали.

То моё беспокойство что я не написал ни одного поста - было нивелировано тем, что смысл постов просто обесценился.

Наличие научных публикаций в дипломе, на которое так пытались дрочить научруки, и чего я не стал делать - очевидно что полная хуйня. Круто что не вляпался в это ЧСВшное дерьмо... Просто делаешь что хочешь, для себя, и как сам это видишь. Всё. Объяснять кому-то очевидные с одной стороны, и агностические с другой стороны темы - бред. Главное - результат. А он есть.

Блин, смысл статьи то в чём? Я однажды смог ускорить обучение нейронки в 10к раз, что шло вразрез с подобием доки (на тот момент их не было), и просто рассказал об этом ребятам в команде, и всё. Похоже в этом было бы гораздо больше смысла, чем в этой статье.

Да и в целом алгоритм туповатый. Как и UX. Суть программы это упростить что-то, а не усложнить, задавая очевидные и ненужные вопросы. Задача - либо ввод уравнения целиком (с парсингом), либо коэффициентов, и всё. Ввод коэффициента A,B,C - тоже звучит тупо, потому что не понятно к какой степени они относятся. Эти цифры в принципе не были нужны. Очевидно что нужно было вместо них писать неизвестную с показателем. А сейчас программа зачем? Половина это копипаста, перегруженный интерфейс, так ещё и непонятный.

В соседней "статье" вполне себе великовозрастный чувак просто спросил у роботов какая книга-игра-фильм им нравится в каком то аспекте и тупо заполнил всю статью копипастой ответов. Хорошо что теперь на хабре есть кнопка для игнора авторов, плохо что нельзя игнорить сразу целые сообщества паразитов.

Неплохо для первого проекта. Я так баловался с реализацией алгоритма дисперсии, это поинтереснее будет.

Можете ознакомиться с ttk.button() или, лучше, с более совершенными формами tkinter вроде customtkinter. Тогда можно сделать близкое к WinUI стилю, более современно выглядящее приложение, а не просто WinForms, примерно такое, как товарищ выше в комментах прислал. Это возможно и c Python.

Если интересно, потом покажу свой старый эксперимент "DisperiaPro", на котором я разбирался с компиляцией бинарников на Python и реализовал подсчёт среднеквадратичного отклонения, дисперсии и др.

Ну чего вы негативите так народ?

Ну да, тема не хабровская совсем, просто школьник написал код и показал это миру.

В целом, он не виноват что его пост одобрили и опубликовали)

Раз есть что есть, лучше поддержим его как старшие коллегия))

А негативить идём под посты типа "я X и за 30 секунд сделал свое приложение через ИИ, так что эти ваши прахрамисты никому не нужны"

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации