Ипотечный калькулятор, неспособный использовать переменные как целые числа, чтобы сделать математическую формулу - PullRequest
1 голос
/ 09 февраля 2020

Я пытаюсь подать заявку на расчет ипотеки (у меня был мотив для этого, из вопроса ранее, здесь). Но, похоже, думал, что это не сработает. У меня проблема в том, что я не могу предоставить функции вычислений 3 входа, p, i, n, которые я получаю из опции Entry в tkinter.

import time
from tkinter import *


class MortgageCalc:
    def __init__(self, master):
        global p, i, n

        p = IntVar()
        i = IntVar()
        n = IntVar()

        self.clock = Label(master, font=("times", 20, "bold"), bg="white")
        self.clock.pack(side='bottom', anchor='e')
        self.tick()

        self.title = Label(master, text="Welcome to Dev's Mortgage Calculater!", font=("times", 23, "bold"), bg="aqua")
        self.title.pack(anchor=W)

        self.title = Label(master, text="Enter the information below to calculate your mortgage.", font=("times", 18), bg="aqua")
        self.title.pack(anchor=W)

        self.P = Entry(master, width=60, textvariable=p)
        self.P.pack(pady=50, padx=50)

        self.I = Entry(master, width=60, textvariable=i)
        self.I.pack(pady=50, padx=50)

        self.N = Entry(master, width=60, textvariable=n)
        self.N.pack(pady=50, padx=50)

        self.calcMortgage = Button(master, text='Calculate Monthly Mortgage Payment', font=10, fg='green', command=self.calculations, width=30, height=2)
        self.calcMortgage.pack(pady=50, padx=50)

        self.monthlyPayment = Label(master, text="Your monthly mortgage payment is", font=("times", 20, "bold"), bg="white")
        self.monthlyPayment.pack()
        self.calculations()

    def tick(self):
        time_string = time.strftime("%H:%M:%S")
        self.clock.config(text=time_string)
        self.clock.after(200, self.tick)

    def calculations(self):
        global p, i, n

        p = p.get()
        i = i.get()
        n = n.get()

        divide1 = p * (i * (1 + i) ** n)
        divide2 = ((1 + i) ** n - 1)
        payment = divide1 / divide2
        self.monthlyPayment.config(text=str(payment))


root = Tk()
root.title("Dev's Mortgage Calculator")
root.geometry('1025x750')
Tk = MortgageCalc(root)
root.mainloop()

Я получаю эту ошибку еще до того, как окно откроется!

Traceback (most recent call last):
  File "C:/Users/muhmm/PycharmProjects/untitled2/da.py", line 60, in <module>
    Tk = MortgageCalc(root)
  File "C:/Users/muhmm/PycharmProjects/untitled2/da.py", line 37, in __init__
    self.calculations()
  File "C:/Users/muhmm/PycharmProjects/untitled2/da.py", line 53, in calculations
    payment = divide1 / divide2
ZeroDivisionError: division by zero

И проблема в функции вычислений, как будто я оттуда удаляю код и помещаю «пройти», приложение работает полностью нормально.

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

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Я удалил self.calculations() из def __init__, потому что это вызывает деление на 0.

Затем, предполагая, что вы хотите, чтобы все значения были целыми, я изменил:

p = p.get()
i = i.get()
n = n.get()

на

p = int(self.P.get())
i = int(self.I.get()) / 100
n = int(self.N.get())

, потому что вы не получали значения из текстовых полей, а «i» не делилось на 100, чтобы сделать его скалярным от 0 до 1 (что, я думаю, должно иметь место в вашей формуле )

Я не проверил вашу месячную формулу, но думаю, что это должно быть:

divide2 = ((1 + i) ** (n - 1))

и добавьте предложение @ MasterOfTheHouse, и все должно быть в порядке!

0 голосов
/ 09 февраля 2020

У вас там должны быть другие проблемы (кроме деления на ноль). Просто сделайте проверку, как этот, а затем ищите другие проблемы.

payment = 0 if divide2 == 0 else divide1/divide2

Это быстрое исправление сработало для меня

enter image description here

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...