Вы должны попробовать упаковать свои виджеты с функцией grid()
... это гораздо более гибко для позиционирования
import tkinter
from tkinter import *
class Loan:
def __init__(self):
#Create main Window
self.main_window = tkinter.Tk()
self.main_window.title("Loan Calculator")
#Create the six frames
self.intRate_frame = tkinter.Frame(self.main_window)
self.numYears_frame = tkinter.Frame(self.main_window)
self.loanAmount_frame = tkinter.Frame(self.main_window)
self.monthlyPayment_frame = tkinter.Frame(self.main_window)
self.totalPayment_frame = tkinter.Frame(self.main_window)
self.button_frame = tkinter.Frame(self.main_window)
# Create and pack the widgets for interest rate
self.intRate_label = tkinter.Label(self.intRate_frame, \
text='Annual Interest Rate', anchor="w")
self.intRate_entry = tkinter.Entry(self.intRate_frame, \
width=20)
self.intRate_label.grid(row=0, column=0, sticky=W)
self.intRate_entry.grid(row=0, column=1, sticky=W)
#Create and pack the widgets for number of years
self.numYears_label = tkinter.Label(self.numYears_frame, \
text='Number of Years', anchor = "w")
self.numYears_entry = tkinter.Entry(self.numYears_frame, \
width=20)
self.numYears_label.grid(row=1, column=0, sticky=W)
self.numYears_entry.grid(row=1, column=1, sticky=W)
#Create and pack the widgets for loan Amount
self.loanAmount_label = tkinter.Label(self.loanAmount_frame, \
text='Loan Amount', anchor = "nw")
self.loanAmount_entry = tkinter.Entry(self.loanAmount_frame, \
width=20)
self.loanAmount_label.grid(row=2, column=0, sticky=W)
self.loanAmount_entry.grid(row=2, column=1, sticky=W)
#Create and pack the widgets for monthly payment
self.result_label = tkinter.Label(self.monthlyPayment_frame, \
text='Monthly Payment', anchor="w")
self.monthlyPayment = tkinter.StringVar() # To update avg_label
self.monthlyPayment_label = tkinter.Label(self.monthlyPayment_frame, \
textvariable=self.monthlyPayment)
self.result_label.grid(row=3, column=0, sticky=W)
self.monthlyPayment_label.grid(row=3, column=1, sticky=W)
#Create and pack the widgets for total payment
self.result2_label = tkinter.Label(self.totalPayment_frame, \
text='Total Payment', anchor="w")
self.totalPayment = tkinter.StringVar() # To update avg_label
self.totalPayment_label = tkinter.Label(self.totalPayment_frame, \
textvariable=self.totalPayment)
self.result2_label.grid(row=4, column=0, sticky=W)
self.totalPayment_label.grid(row=1, column=1, sticky=W)
#Create and pack the widgets for the button widgets
self.compute_button = tkinter.Button(self.button_frame, \
text='Compute Payment', command=self.calc)
self.compute_button.pack(side='left')
self.intRate_frame.grid(row=1, column=1, sticky=W)
self.numYears_frame.grid(row=2, column=1, sticky=W)
self.loanAmount_frame.grid(row=3, column=1, sticky=W)
self.monthlyPayment_frame.grid(row=4, column=1, sticky=W)
self.totalPayment_frame.grid(row=5, column=1, sticky=W)
self.button_frame.grid(row=6, column=1, sticky=W)
tkinter.mainloop()
def calc(self):
#Get
self.intRate = float(self.intRate_entry.get())
self.numYears = float(self.numYears_entry.get())
self.loanAmount = float(self.loanAmount_entry.get())
#Calculations
monthlyIntRate = self.intRate / 1200
monthlyPayment = self.loanAmount * monthlyIntRate/(1 - (1 / (1 + [enter image description here][1]monthlyIntRate) ** (self.numYears * 12)))
totalPayment = self.monthlyPayment * self.numYears * 12 #calculates the total payment
self.monthlyPayment.set(self.monthlyPayment)
self.totalPayment.set(self.totalPayment)
loan1 = Loan()
![enter image description here](https://i.stack.imgur.com/VnW4e.jpg)