Great Deal! Get Instant $10 FREE in Account on First Order + 10% Cashback on Every Order Order Now

ITECH1400_Assignment_2/123456.txt 123456 7890 5000.0 0.33 Deposit 3000.0 Deposit 4000.0 Withdrawal 2000.0 ITECH1400_Assignment_2/bankaccount.py class BankAccount(): def __init__(self): '''Constructor...

1 answer below »
ITECH1400_Assignment_2/123456.txt
123456
7890
5000.0
0.33
Deposit
3000.0
Deposit
4000.0
Withdrawal
2000.0
ITECH1400_Assignment_2
ankaccount.py
class BankAccount():
def __init__(self):
'''Constructor to set account_number to '0', pin_number to an empty string,
XXXXXXXXXXbalance to 0.0, interest_rate to 0.0 and transaction_list to an empty list.'''

def deposit_funds(self, amount):
'''Function to deposit an amount to the account balance. Raises an
XXXXXXXXXXexception if it receives a value that cannot be cast to float.'''

def withdraw_funds(self, amount):
'''Function to withdraw an amount from the account balance. Raises an
XXXXXXXXXXexception if it receives a value that cannot be cast to float. Raises
XXXXXXXXXXan exception if the amount to withdraw is greater than the available
XXXXXXXXXXfunds in the account.'''
def get_transaction_string(self):
'''Function to create and return a string of the transaction list. Each transaction
XXXXXXXXXXconsists of two lines - either the word "Deposit" or "Withdrawal" on
XXXXXXXXXXthe first line, and then the amount deposited or withdrawn on the next line.'''
def save_to_file(self):
'''Function to overwrite the account text file with the cu
ent account
XXXXXXXXXXdetails. Account number, pin number, balance and interest (in that
XXXXXXXXXXprecise order) are the first four lines - there are then two lines
XXXXXXXXXXper transaction as outlined in the above 'get_transaction_string'
XXXXXXXXXXfunction.'''
ITECH1400_Assignment_2/ITECH1400_Assignment_2_FedUni_Banking.pdf
ITECH1400 – Foundations of Programming
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 1 of 10
ITECH1400 - Assignment 2 – FedUni Banking
Due Date: 5pm, Friday of Week 11
This assignment will test your skills in designing and programming applications to specification and is worth
20% of your non-invigilated (type A) marks for this course. This is an INDIVIDUAL ASSIGNMENT – and while
you may discuss it with your fellow students, you must not share designs or code or you will be in
each of
the university plagiarism rules. This assignment should take you approximately 20 hours to complete.
Assignment Overview
You are tasked with creating an application that uses a GUI that simulates a simple banking interface similar to
an ATM / online banking using the Python 3 programming language.
The assignment is
oken up into five main components:
1.) The ability to provide an account number and a PIN
(Personal Identification Number) to sign into a bank
account,

2.) The ability to view the balance of the bank account and
to deposit and withdraw virtual money into and out
from the account,

3.) The ability to save transactions via file storage so that
you can log in, deposit some money and then log out –
and when you log back in that money is still there, and
finally

4.) The ability to display a graph of projected earnings on
the bank account via the compound interest accrued
over a variable amount of time.

5.) A Test Case that ensures your BankAccount's deposit and withdraw functionality operates co
ectly.
Your submission should consist of three Python scripts that implement this application as described in the
following pages: bankaccount.py, main.py along with a testbankaccount.py which contains a small test case
with a few simple unit tests than ensure that your bank accounts deposit_funds and withdraw_funds methods
operate co
ectly.
You are provided with a 'stub' of each of these files which contain all the function declarations and comments
which describe the role of the function and how it can be put together, but you will have to write the code for
vast majority of the functions yourself. You are also provided with a stub of the bankaccounttestcase.py file.
Your final submission should be a zipped archive (i.e. ‘zip file’) containing your completed Python scripts.
There is no word processed component to this second assignment.
ITECH1400 – Foundations of Programming
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 2 of 10
Bank Account Class Design
The design for a BankAccount object is laid out in the following class diagram:



As you might imagine, the deposit_funds(amount) function adds that money to the cu
ent balance of the
account, and the withdraw_funds(amount) function removes (i.e. subtracts) money from the cu
ent balance
of the account. Each transaction in the transaction_list is a tuple containing either the word Deposit or the word
Withdrawal followed by an amount, for example: ("Deposit", XXXXXXXXXXor ("Withdrawal", 100.0).
The bank accounts in our program do not have an overdraft facility so the user cannot withdraw money they
do not have – that is, if they had $200 in their account and they tried to withdraw more than $200 then the
operation should fail and the withdraw_funds function should raise an Exception with a suitable e
or message
which is caught and displayed in the main.py file where the operation was attempted.
All e
or messages such as those from exceptions should be displayed in a pop-up messagebox.
The get_transaction_string method should loop over all the transactions in the transaction_list creating a string
version (with newline characters) of all the transactions associated with the account.
The save_to_file function should save the account_number, pin_number, balance, and interest_rate in that
order to a file called .txt followed by the transaction list string generated from the
get_transaction_string() method. The name of the account file is NOT '.txt' - the name of
the file is the ACTUAL ACCOUNT NUMBER followed by ".txt", so for an account with account_number 123456
the name of the account file would be XXXXXXXXXXtxt.
A full ‘walk-through’ video demonstrating the completed application and how it operates will be provided along
with this assignment document.
BankAccount
account_number: int
pin_number: string
alance: float
interest_rate: float
transaction_list: list of two-tuples
deposit_funds(amount)
withdraw_funds(amount)
get_transaction_string()
save_to_file()
ITECH1400 – Foundations of Programming
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 3 of 10
Calculating Interest
To make it worthwhile for you to keep your money with a bank, the bank offers you an interest rate on your
savings. Interest will be applied to the balance of an account once per month.
Let’s do an example – suppose you had $10,000 in a bank account and the bank paid you monthly interest at a
ate of 3% per year. That would mean the bank pays you 3% of your balance divided by 12 (because there are
12 months in a year) per month. If we start our example on January and run it for a few months (and we don’t
deposit or withdraw any money throughout the year) then we end up with our bank balance changing like this:

Note: 3% divided by 12 is 0.25% per month – so we’ll multiply our balance by XXXXXXXXXXto get the new balance.
Jan Feb Mar Apr May Jun Jul Aug Etc.
10, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX, XXXXXXXXXX,176.32 …

What’s happening here is that the interest is compounding – which just means that we get that 0.25% applied
not only to our principle balance (i.e. the $10,000 we started with), but it also gets applied to the interest we
earnt. Although 3% interest is very low (but in line with the best rates you’d get in Australia at the moment
ecause interest rates are very low), over time this compounding makes a serious difference!
Because FedUni Bank is the greatest bank of all time, it offers all accounts an interest rate of 33%.
The Main Python Script
Our main.py script will contain all the main logic for our program. It will allow us to:
- Enter an account number via an Entry field by using the keyboard,
- Enter a PIN number via an Entry widget (we can use the keyboard OR a series of buttons to enter the
PIN),
- Once we are logged in we must be able to:
o See the balance of our account,
o Deposit funds into our account,
o Withdraw funds from our account (only up to the amount we have available),
o Display a plot of our projected interest over the next 12 months as outlined above, and finally
o Log out of our account.
Every time a successful deposit or withdrawal is made then a new transaction should be added to the account's
transaction list. When we log out then the account file is overwritten with the new account details including
our new balance and any transactions if any have been made.
The format of the account text file is as follows (each value on separate lines):
account_number
account_pin
alance
interest_rate
ITECH1400 – Foundations of Programming
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 4 of 10
For example, account number XXXXXXXXXXwith PIN 7890 and a balance of $800 with an interest rate of 33% would
look like this:
123456
7890
800.00
0.33

After these first four lines we may have a number of transactions, each of which is specified as two lines. A
deposit is indicated by the word Deposit on one line and then the amount on the next like. For example a
deposit of $500 would look like this:
Deposit
500.00

Similarly, a withdrawal is also specified as two lines – first the word Withdrawal and then on the next line the
amount, for example a withdrawal of $200 would look like this:
Withdrawal
200.00
Answered Same Day May 23, 2020 ITECH1400

Solution

Abr Writing answered on May 28 2020
142 Votes
123456.txt
123456
7890
5000.0
0.33
Deposit
3000.0
Deposit
4000.0
Withdrawal
2000.0
main.py
import tkinter as tk
from tkinter import messagebox
from pylab import plot, show, xlabel, ylabel
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from bankaccount import BankAccount
win = tk.Tk()
# Set window size here to '440x640' pixels
win.geometry('440x640')
# Set window title here to 'FedUni Banking'
win.title('FedUni Banking')
# The account number entry and associated variable
account_number_var = tk.StringVar()
account_number_entry = tk.Entry(win, textvariable=account_number_var)
account_number_entry.focus_set()
# The pin number entry and associated variable.
# Note: Modify this to 'show' PIN numbers as asterisks (i.e. **** not 1234)
pin_number_var = tk.StringVar()
account_pin_entry = tk.Entry(win, text='PIN Number', textvariable=pin_number_var, show='*')
# The balance label and associated variable
alance_var = tk.StringVar()
alance_var.set('Balance: $0.00')
alance_label = tk.Label(win, textvariable=balance_var)
# The Entry widget to accept a numerical value to deposit or withdraw
amount_entry = tk.Entry(win)
# The transaction text widget holds text of the accounts transactions
transaction_text_widget = tk.Text(win, height=10, width=48)
# The bank account object we will work with
account = BankAccount()
# ---------- Button Handlers for Login Screen ----------
def clear_pin_entry(event):
'''Function to clear the PIN number entry when the Clear / Cancel button is clicked.'''
# Clear the pin number entry here
pin_number_var.set('')
def handle_pin_button(event):
'''Function to add the number of the button clicked to the PIN number entry via its associated variable.'''
# Limit to 4 chars in length
pin = account_pin_entry.get()
# Set the new pin number on the pin_number_va
if len(pin) < 4:
pin_number_var.set(pin+str(event))
def log_in(event):
'''Function to log in to the banking system using a known account number and PIN.'''
global account
global pin_number_va
global account_number_entry
# Create the filename from the entered account number with '.txt' on the end
# Try to open the account file for reading
try:
with open(account_number_entry.get()+'.txt') as f:
# Open the account file for reading
index = 0
# First line is account numbe
for line in f:
line = line.strip()
if index == 0:
account.account_number = line
# Second line is PIN number, raise exceptionk if the PIN entered doesn't match account PIN read
elif index == 1:
account.pin_number = line
if account.pin_number != pin_number_var.get():
raise Exception('Inco
ect PIN number')
# Read third and fourth lines (balance and interest rate)
elif index == 2:
account.balance = float(line)
elif index == 3:
account.interest_rate = float(line)
# Section to read account transactions from file - start an infinite 'do-while' loop here
elif index % 2 == 0:
temp = line
else:
account.transaction_list.append((temp, line))
# Attempt to read a line from the account file,
eak if we've hit the end of the file. If we
# read a line then it's the transaction type, so read the next line which will be the transaction amount.
# and then create a tuple from both lines and add it to the account's transaction_list
index += 1
# Close the file now we're finished with it

# Catch exception if we couldn't open the file or PIN entered did not match account PIN
except:
# Show e
or messagebox and & reset BankAccount object to default...
raise Exception('Account Not Found')
# ...also clear PIN entry and change focus to account number entry
pin_number_var.set('')
# Got here without raising an exception? Then we can log in - so remove the widgets and display the account screen
# ---------- Button Handlers for Account Screen ----------
create_account_screen()
def save_and_log_out():
'''Function to overwrite the account file with the cu
ent state of
the account object (i.e. including any new transactions), remove
all widgets and display the login screen.'''
global account
# Save the account with any new transactions
account.save_to_file()
# Reset the bank acount object

# Reset the account number and pin to blank
account_number_var.set('')
pin_number_var.set('')
# Remove all widgets and display the login screen again
remove_all_widgets()
create_login_screen()
def perform_deposit():
'''Function to add a deposit for the amount in the amount entry to the
account's transaction list.'''
global account
global amount_entry
global balance_label
global balance_va
# Try to increase the account balance and append the deposit to the account file
try:
# Get the cash amount to deposit. Note: We check legality inside account's deposit method
account.deposit_funds(amount_entry.get())
# Deposit funds

# Update the transaction widget with the new transaction by calling account.get_transaction_string()
# Note: Configure the text widget to be state='normal' first, then delete contents, then instert new
# contents, and finally configure back to state='disabled' so it cannot be user edited.
transaction_text_widget.configure(state='normal')
transaction_text_widget.delete(1.0, tk.END)
for transaction in account.get_transaction_string():
transaction_text_widget.insert(tk.END, transaction[0]+'\n')
transaction_text_widget.insert(tk.END, transaction[1]+'\n')
transaction_text_widget.configure(state="disabled")

# Change the balance label to reflect the new balance
balance_var.set('Balance: ${}'.format(account.balance))
# Clear the amount entry
amount_entry.delete(0, 'end')
...
SOLUTION.PDF

Answer To This Question Is Available To Download

Related Questions & Answers

More Questions »

Submit New Assignment

Copy and Paste Your Assignment Here