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

ITECH1400 – Foundations of Programming – SEM3/18 School of Science, Engineering and Information Technology CRICOS Provider No. 00103D Page 1 of 9 ITECH1400 - Assignment 2 – Money Manager Due Date:...

1 answer below »
ITECH1400 – Foundations of Programming – SEM3/18
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 1 of 9
ITECH1400 - Assignment 2 – Money Manager
Due Date: Friday of Week 11 at 5pm
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 money manager. This tool
is used to track all spending of an individual.
The assignment is
oken up into the following main components:
1.) The ability to provide a login screen to prevent other people from
viewing the information contained in the tool

2.) The ability to view the cu
ent balance funds, add purchases made
and deposits into the balance

3.) The ability to save the transactions to a file so that you can log in,
add transactions to the application, log out and then return to find
all of the transactions still there – i.e. the data is persistent.

4.) The ability to display a graph of your spending
oken down by
type – i.e. food, bills, rent.

5.) A Test Case that ensures that your simple money manager works as required.

Your submission should consist three Python scripts that implement the computer program
(moneymanager.py, main.py and testmoneymanager.py).
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 moneymanagertestcase.py file.
Your final submission should be a zipped archive (i.e. ‘zip file’) containing your completed Python scripts.
ITECH1400 – Foundations of Programming – SEM3/18
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 2 of 9
Assignment Part 1 Details
Class Design – Money Manager Tool
The following design for MoneyManage
The following is the functionality of the class:
• add_entry – this adds a new entry into the money manager representing the spending of the user. This
includes the amount spent and the type of item the money was spend on. It also removes the amount
from the cu
ent balance. For the sake of simplicity the type of item the money was spent on can only
e food, rent, bills, entertainment or other – any other type will raise an exception that should be
handled
• Each transaction in the transaction_list is a tuple containing the word Deposit followed by an amount
or EntryType followed by an amount
• The user the tool represents cannot go into a negative balance so the user cannot spend money that is
not available in their user. So if they have $100 in their user and then want to add an entry to spend
$150 an exception will be raised 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 message box
• 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 user.
• The save_to_file function should save the user_number, pin_number, and balance 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 user file is NOT '.txt' - the name of
the file is the ACTUAL USER NUMBER followed by ".txt", so for an user with user_number XXXXXXXXXXthe
name of the user file would be XXXXXXXXXXtxt.
MoneyManager
user_number: int
pin_number: String
alance: float
transaction_list: list of two-tuples
add_entry(amount, entry_type)
deposit_funds(amount)
get_transaction_string()
save_to_file()
ITECH1400 – Foundations of Programming – SEM3/18
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 3 of 9
The Main Python Script
Our main.py script will contain all the main logic for our program. It will allow us to:
• Enter a user 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 the user,
o Deposit money for the user,
o Add entries to represent spending of funds from our user (only up to the amount we have
available),
o Display a plot of spending
o Log out of our user.
Every time a successful deposit or entry is made then a new transaction should be added to the user's
transaction list. When we log out then the user file is overwritten with the new user details including our new
alance and any transactions if any have been made.
The format of the user text file is as follows (each value on separate lines):
user_number
user_pin
cu
entBalance

123456
7890
800.00

After these first three 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 entry is also specified as two lines – first the word being the type of entry and then on the next line the
amount, for example entries representing rent of $200 and bills of $250 would look like this:

Rent
200.00
Bills
250.00

You are provided with an example user file called XXXXXXXXXXtxt – this file along with others will be used to mark
your assessment, so you should make sure that your final submission can use users in this format successfully.

ITECH1400 – Foundations of Programming – SEM3/18
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 4 of 9
Login Screen
When the application is first launched, it should open a window that is "500x660" pixels in size (use the window
object’s geometry function to set this). Set the title of the window to "FedUni Money Manager" using the top-level
window object's winfo_toplevel().title() function.
The window uses the GridManager layout manager for placing GUI elements
(e.g. 'widgets'), it contains a Label that spans the top of the window saying
"FedUni Money Manager" (font size is 28). On the next line is a label saying "User
Number" and then an Entry widget for the user to type in their user number and
an entry for the PIN number.
It then has a series of buttons from 0 through 9, along with a Log In button and
a Clea
Cancel button.
Each time a number is pressed it is added to a string - for example, if the user
pushed the 4 button then the 3 button then the 2 button and then the 1 button
then the string should contain the text "4321". By using the show="*" attribute
you can 'mask' the input so that anyone looking over your shoulder cannot see
the exact pin number, they'll just see "****" instead. When the Clea
Cancel
utton is pressed, or when a user "logs out" then this PIN string should be reset
to an empty string.
When the Log In button is pressed then the program should attempt to open the file with the user number followed
y ".txt" - so in the example below, because the user number entered was "123456", the program will attempt to
open the file "123456.txt".
If that file could not be opened then a messagebox should display a suitable e
or message such as "Invalid user
number - please try again!". You will have to "try/catch" this risky functionality to avoid the program crashing - see
the week 7 lecture materials if you need a recap.
If the user exists, then MoneyManager object should be created and the fields of the MoneyManager object should
e set (e.g. user_number, pin_number, balance, and the transaction_list).
Because you don't know how many transactions are stored for this user, after reading the first three lines you will
need to attempt to read two lines and if they exist create a tuple of the transaction (i.e. it's type and amount) and
then add it to the MoneyManager object's transaction_list - for example you may do the following in a loop:
# Try to read a line,
eak if we've hit the end of the file
line = read_line_from_user_file()
if not line:
eak
else:
# read another line, create a tuple from both lines and append the # tuple
to the the MoneyManager object's transaction_list

The user screen has:
- A large "FedUni Money Manager" label at the top that spans 5 columns (font size is 22),
- A label with the user number followed by the actual user number displayed,
ITECH1400 – Foundations of Programming – SEM3/18
School of Science, Engineering and Information Technology
CRICOS Provider No. 00103D Page 5 of 9
- A label with the cu
ent balance followed by the actual balance,
- A log out button which saves the user file (overwriting it) and causes all widgets to be removed from the screen
and the log in screen displayed again,
- An "Amount" label followed by an amount Entry widget where you can type in how much to deposit or an entry
added,
- Deposit and Withdraw buttons that deposit or withdraw funds using the MoneyManager classes methods to do
so,
- A Text widget (i.e. multi-line text) that shows
Answered Same Day Feb 04, 2021 ITECH1400

Solution

Ximi answered on Feb 05 2021
138 Votes

cfile_c_636845191878483184_36529_1/testmoneymanager.py
import unittest
from moneymanager import MoneyManage
class TestMoneyManager(unittest.TestCase):
def setUp(self):
# Create a test BankAccount object
self.user = MoneyManager()
# Provide it with some initial balance values
self.user.balance = 1000.0
def test_legal_deposit_works(self):
# Your code here to test that depsositing money using the account's
# 'deposit_funds' function adds the amount to the balance.

def test_illegal_deposit_raises_exception(self):
# Your code here to test that depositing an illegal value (like 'bananas'
# or such - something which is NOT a float) results in an exception being
# raised.

def test_legal_entry(self):
# Your code here to test that adding a new entry with a a legal amount subtracts the
# funds from the balance.

def test_illegal_entry_amount(self):
# Your code here to test that withdrawing an illegal amount (like 'bananas'
# or such - something which is NOT a float) raises a suitable exception.

def test_illegal_entry_type(self):
# Your code here to test that adding an illegal entry type (like 'bananas'
# or such - something which is NOT a float) raises a suitable exception.

def test_insufficient_funds_entry(self):
# Your code here to test that you can only spend funds which are available.
# For example, if you have a balance of 500.00 dollars then that is the maximum
# that can be spent. If you tried to spend 600.00 then a suitable exception
# should be raised and the withdrawal should NOT be applied to the user balance
# or the user's transaction list.
# Run the unit tests in the above test case
unittest.main()
__MACOSX/cfile_c_636845191878483184_36529_1/._testmoneymanager.py
cfile_c_636845191878483184_36529_1/moneymanager.py
class MoneyManager():

def __init__(self, username, password, balance, transaction_list):
'''Constructor to set username to '', pin_number to an empty string,
balance to 0.0, and transaction_list to an empty list.'''
self.username = username
self.password = password
self.balance = balance
self.transaction_list = transaction_list

def add_entry(self, entry_type, amount):
'''Function to add and entry an amount to the tool. Raises an
exception if it receives a value for amount that cannot be cast to float. Raises an exception
if the entry_type is not valid - i.e. not food, rent, bills, entertainment or other'''
entries = ["food", "rent", "bills", "entertainment", "other"]
if entry_type.lower() not in entries:
raise ValueE
or("Cannot have this entry.")
if float(self.balance)-float(amount) < 0:
raise ValueE
or("Amount exceeds your balance")
self.transaction_list.append((entry_type, amount))
def deposit_funds(self, amount):
'''Function to deposit an amount to the user balance. Raises an
exception if it receives a value that cannot be cast to float. '''
self.transaction_list.append(("Deposit", amount))
self.balance = str(float(self.balance)+float(amount))

def get_transaction_string(self):
'''Function to create and return a string of the transaction list. Each transaction
consists of two lines - either the word "Deposit" or the entry type - food etc - on
the first line, and then the amount deposited or entry amount on the next line.'''
string = ["\n{}\n{}".format(e, a) for e,a in self.transaction_list]
return string
def save_to_file(self):
'''Function to overwrite the user text file with the cu
ent use
details. user number, pin number, and balance (in that
precise order) are the first four lines - there are then two lines
per transaction as outlined in the above 'get_transaction_string'
function.'''
string = self.get_transaction_string()
with open(self.username+".txt", "w") as f:
f.write(self.username+"\n")
f.write(self.password+"\n")
f.write(self.balance)
for s in string:
f.write(s)
__MACOSX/cfile_c_636845191878483184_36529_1/._moneymanager.py
cfile_c_636845191878483184_36529_1/__pycache__/moneymanager.cpython-37.pyc
cfile_c_636845191878483184_36529_1/123456.txt
123456
7890
6500.0
Deposit
3000.0
Deposit
4000.0
Rent
2000.0
Deposit
1000
ills
1000
Deposit
1000
Deposit
1000
__MACOSX/cfile_c_636845191878483184_36529_1/._123456.txt
cfile_c_636845191878483184_36529_1/main.py
import tkinter as tk
from tkinter import *
from tkinter import messagebox
#from pylab import plot, show, xlabel, ylabel
#from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
#from matplotlib.figure import Figure
from collections import defaultdict
from pprint import pprint
#import matplotlib.pyplot as plt
from moneymanager import MoneyManage
win = tk.Tk()
#Set window size here to '540 x 640'
win.geometry("540x640")
#Set the window title to 'FedUni Money Manager'
win.title("FedUni Money Manager")
#The user number and associated variable
user_number_var = tk.StringVar()
#This is set as a default for ease of testing
user_number_var.set('123456')
user_number_entry = tk.Entry(win, textvariable=user_number_var)
user_number_entry.focus_set()
#The pin number entry and associated variables
pin_number_var = tk.StringVar()
#This is set as a default for ease of testing
pin_number_var.set('7890')
#Modify the following to display a series of * rather than the pin ie **** not 1234
user_pin_entry = tk.Entry(win, text='PIN Number', textvariable=pin_number_var, show="*")
#set the user file by default to an empty string
user_file = ''
# 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_var = tk.StringVar()
tkVar=StringVar(win)
amount_entry = tk.Entry(win)
entry_type=tk.Entry(win)
# The transaction text widget holds text of the transactions
transaction_text_widget = tk.Text(win, height=10, width=48)
# The money manager object we will work with
#user = MoneyManager()
# ---------- Button Handlers for Login Screen ----------
def clear_pin_entry():
'''Function to clear the PIN number entry when the Clear / Cancel button is clicked.'''
# Clear the pin number entry here
user_number_entry.delete(first=0, last=END)
user_pin_entry.delete(first=0, last=END)
def handle_pin_button(event):
'''Function to add the number of the button clicked to the PIN number entry.'''
# Limit to 4 chars in length
# Set the new pin number on the pin_number_va
text = event.widget["text"]
if text in list(map(str, range(10))):
user_pin_entry.insert(END, text)

win.bind("", handle_pin_button)
def log_in():
'''Function to log in to the banking system using a known user number and PIN.'''
global use
global pin_number_va
global user_file
global user_number_entry
with open(user_number_entry.get()+".txt", "r") as f:
data = f.read().split('\n')
user = data[0]
password_ = data[1]
assert user_pin_entry.get() == password_, "Invalid password"
balance = data[2]
transaction_list = [(data[idx], data[idx+1]) for idx in range(3, len(data)-1, 2)]
user = MoneyManager(user_number_entry.get(), password_, balance, transaction_list)

create_user_screen()

# ---------- Button Handlers for User Screen ----------
def save_and_log_out():
'''Function to overwrite the user file with the cu
ent state of
the user object (i.e. including any new transactions), remove
all widgets and display the login screen.'''
global use
user.save_to_file()
win.destroy()
def perform_deposit():
'''Function to add a deposit for the amount in the amount entry to the
user's transaction list.'''
global user
global amount_entry
global balance_label
global balance_va
# Try to increase the account balance and append the deposit to the account file

# Get the cash amount to deposit. Note: We check legality inside account's deposit method
# 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.
# Change the balance label to reflect the new balance
# Clear the amount entry
# Update the interest graph with our new balance
# Catch and display exception as a 'showe
or' messagebox with a title of 'Transaction E
or' and the text of the exception
def perform_transaction():
'''Function to add the entry the amount in the amount entry from the user balance and add an entry to the transaction list.'''
global user
global amount_entry
global balance_label
global balance_va
global entry_type
# Try to decrease the account balance and append the deposit to the account file

# Get the cash amount to use. Note: We check legality inside account's withdraw_funds method
# Get the type of entry that will be added ie rent etc

# Withdraw funds from the balance
# Update the transaction widget with the new transaction by calling user.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.
# Change the balance label to reflect the new balance
# Clear the amount entry
# Update the graph
# Catch and display any returned exception as a messagebox 'showe
or'
def remove_all_widgets():
'''Function to remove all the widgets from the window.'''
global win
for widget in win.winfo_children():
widget.grid_remove()
def read_line_from_user_file():
'''Function to read a line from the users file but not the last newline character.
Note: The user_file must be open to read from for this function to succeed.'''
global user_file
return user_file.readline()[0:-1]
def plot_spending_graph():
'''Function to plot the user spending here.'''
# YOUR CODE to generate the x and y lists here which will be plotted
#Your code to display the graph on the screen here - do this last

# ---------- UI Drawing Functions ----------
def create_login_screen():
'''Function to create the login screen.'''
Label(win, text='FedUni Money Manager',font=("Helvetica", 22)).grid(row=0, column=0, columnspan=3)
Label(win, text='Username/ PIN').grid(row=1, column=0)
user_number_entry.grid(row=1, column=1)

user_pin_entry.grid(row=1, column=2)
Button(text='1', width=10).grid(row=2,column=0)
Button(text='2', width=10).grid(row=2,column=1)
Button(text='3', width=10).grid(row=2,column=2)
Button(text='4', width=10).grid(row=3,column=0)
Button(text='5', width=10).grid(row=3,column=1)
Button(text='6', width=10).grid(row=3,column=2)
Button(text='7', width=10).grid(row=4,column=0)
Button(text='8', width=10).grid(row=4,column=1)
Button(text='9', width=10).grid(row=4,column=2)
Button(text='Cancel/Clear', width=10, command=clear_pin_entry, bg="red").grid(row=5,column=0)
Button(text='0', width=10).grid(row=5,column=1)
Button(text='Login', width=10,bg="green",command=log_in).grid(row=5,column=2)

def create_user_screen():
'''Function to create the user screen.'''
global amount_text
global amount_label
global transaction_text_widget
global balance_va
global win

win = tk.Tk()
win.geometry("500x600")
Label(win, text='FedUni Money Manager',font=("Helvetica", 22)).grid(row=0, column=0, columnspan=3)
Label(win, text="User Number: {}".format(user_number_entry)).grid(row=1, column=0)
Label(win, text="Balance: {}".format(user.balance)).grid(row=1, column=1)
Label(win, text="Amount ($)").grid(row=2, column=0)

amount_label = Entry(win, width=10,)
amount_label.grid(row=2, column=1)
Button(win, text='Log Out', width=10, command=save_and_log_out).grid(row=1,column=2)

Button(win,text='Deposit', width=10, \
command=lambda: user.deposit_funds(amount_label.get()))\
.grid(row=2,column=2)
lb = Listbox(win, height=5, selectmode=SINGLE)
entries = ["food", "rent", "bills", "entertainment", "other"]
for i in range(len(entries)):
lb.insert(i+1, entries[i])
lb.grid(row=3, column=1)

def get_items_list():
items = list(map(int, lb.curselection()))
item = lb.get(items[0])
return item
Button(win, text='Add Entry', width=10,\
command=lambda: user.add_entry(get_items_list(), amount_label.get()))\
.grid(row=3,column=2)
Label(win, text="Entry Type").grid(row=3, column=0)

textBox = Text(win, height=10, width=48,)
scrollb = Scrollbar(command=textBox.yview)
textBox['yscrollcommand'] = scrollb.set
textBox.grid(row=4, column=0, columnspan=3)
for idx in range(len(user.transaction_list)):
for e in user.transaction_list[idx]:
textBox.insert(INSERT, e+"\n")
#textBox.insert(INSERT, )

# ---------- Display Login Screen & Start Main loop ----------
create_login_screen()
win.mainloop()
__MACOSX/cfile_c_636845191878483184_36529_1/._main.py
__MACOSX/._cfile_c_636845191878483184_36529_1
SOLUTION.PDF

Answer To This Question Is Available To Download

Related Questions & Answers

More Questions »

Submit New Assignment

Copy and Paste Your Assignment Here