tkinter attribute error
Question: I have the class BankAccount that I am using to create a GUI that allows the
user to make a deposit, make a withdrawal, and see their balance.

This is the BankAccount class code:

    
    
    class BankAccount(object):
        """ creates a bank account with the 
            owner's name and a balance """
        def __init__(self, name, balance = 0):
            self.__name = name
            self.__balance = balance
    
        def getName(self):
            """ returns the owner's name """
            return self.__name
    
        def getBalance(self):
            """ returns the current balance """
            return round(self.__balance, 2)
    
        def deposit(self, amount):
            """ deposits amount into the account """
            self.__balance += amount
    
        def withdraw(self, amount):
            """ withdraws amount from the account
                returns 'overdrawn' if balance is too low """
            if self.__balance >= amount:
                self.__balance -= amount
            else:
                return 'overdrawn'
    
        def __str__(self):
            """ return a string representation of the account """
            return self.__name + ' has a balance of $' + str(round(self.__balance, 2))
    

And this is the GUI code:

    
    
    from tkinter import *
    from bankAccountClass import BankAccount
    
    
    
    
    class bankAccountGUI(Frame):
        def __init__(self):
            """Set up the GUI"""
            self.__balance= 0
            Frame.__init__(self)
            self.master.title('Bank Account')
            self.grid()
    
            depositLabel = Label(self, text= "Make Deposit")
            depositLabel.grid(row = 0, column = 0)
            self.depositVar= DoubleVar()
            depositEntry = Entry(self, textvariable= self.depositVar)
            depositEntry.grid(row = 0, column = 1)
    
            withdrawLabel= Label(self, text= "Make Withdrawal")
            withdrawLabel.grid(row = 1, column = 0)
            self.withdrawVar = DoubleVar()
            withdrawEntry= Entry(self, textvariable= self.withdrawVar)
            withdrawEntry.grid(row = 1, column = 1)
    
    
            button_1= Button(self, text = "Enter", command = self.deposit)
            button_1.grid(row = 0, column = 2)
    
            button_2= Button(self, text = "Enter", command = self.withdrawal)
            button_2.grid(row = 1, column = 2)
    
    
        def deposit(self):
            """event handler for button_1"""
            try:
                amount= self.depositVar.get()
                balance= BankAccount.getBalance(self)
                if amount <= 0:
                    messagebox.showerror(message= 'Deposit must be greater than 0')
                else:
                    balance= BankAccount.deposit(self, amount)
                    messagebox.showinfo(title= "Current Balance",
                                        message= "$" + self.balance,
                                        parent= self)
            except ValueError:
                messagebox.showerror(message= "Invalid deposit amount")
    
    
        def withdrawal(self):
            """event handler for button_2"""
            try:
                amount= self.withdrawVar.get()
                balance= BankAccount.getBalance(self)
                if amount > self.balance:
                    messagebox.showerror(message= "Insufficient funds")
                else:
                    balance= BankAccount.withdraw(self, amount)
                    messagebox.showinfo(title= "Current Balance",
                                        message= "$" + self.balance,
                                        parent= self)
            except ValueError:
                messagebox.showerror(message= "Invalid withdrawal amount")
    
    def main():
        """instantiate and pop up the window"""
        bankAccountGUI().mainloop()
    

I'm getting an error that I don't really know what it means or how to fix it.

    
    
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", line 1442, in __call__
        return self.func(*args)
      File "/Users/tinydancer9454/Documents/python/bankAccountGUI.py", line 49, in deposit
        balance= BankAccount.getBalance(self)
      File "/Users/tinydancer9454/Documents/python/bankAccountClass.py", line 24, in getBalance
        return round(self.__balance, 2)
    AttributeError: 'bankAccountGUI' object has no attribute '_BankAccount__balance'
    


Answer: When you call `balance= BankAccount.getBalance(self)` in your `deposit`
function, what you're actually doing is accessing the `getBalance()` method of
the `BankAccount` class, using it uninitialized, and trying to pass in a
different object as `self`. When you call a method by accessing the class
instead of an instance, you do have to give it a `self` object for it to
actually work. BankAccount methods expect their `self` objects to be a
BankAccount object. You're passing it a BankAccountGUI object instead, which
does not contain the `__balance` attribute. That's why its throwing that
error.

What you should be doing is creating an instance of BankAccount, then using
its method:

    
    
    account = BankAccount()
    balance = account.getBalance()
    

Something like that.

