Получить сообщение о том, что «self.mydictValues» не определено, только получить сообщение об ошибке в этой функции (используется в других и работает отлично) - PullRequest
0 голосов
/ 21 февраля 2020

Полный код ошибки:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py", line 1702, in __call__
    return self.func(*args)
  File "<string>", line 97, in withdraw_expense
AttributeError: 'Application' object has no attribute 'mydictValues'

Я использую эту же переменную в других функциях (distribute), и она отлично работает. Ошибка возникает только при использовании в withdraw_expense

from tkinter import *; import sys; import csv
sys.path.insert(1, 'My Desktop'); from UsefulFunctions import setup_screen

class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        with open("dict.csv", "r") as f:
            self.mydict = dict(csv.reader(f))
        self.create_widgets()

    def clear_window(self, x):
        # clears the window

    def create_widgets(self):
        # asks the user to select an input an executes its corresponding function

    def distribute(self):
        # creates a top level next to the main window

        paycheck = int(self.paycheckEntry.get())
        expenses = {"Mortgage":.32, "Electric/Gas":.07, "Water":.02, "Phone/Internet/Cable":.05,"Insurance":.12,
                    "Vehicle":.12, "Groceries":.15, "Entertainment":.05, "Savings":.1}
        self.mydictValues = []
        for value in self.mydict.values():
            self.mydictValues.append(value)

        i = -1
        for key, value in expenses.items():
            i += 1
            self.mydict.update({key : str(float(self.mydictValues[i]) + float(round(paycheck * value, 2)))})


        Label(expense_screen, text = "", bg = "dim gray", width = "55", height = "2", font = ("Calibri", 15)).grid(column = 0, sticky = W)
        Label(expense_screen, text = "These are your monthly expenses").grid(column = 0, sticky = W)
        for key, value in self.mydict.items():
            Label(expense_screen, text = key + ": " + value).grid(column = 0, sticky = W)

        with open("dict.csv", "w") as f:
            writer = csv.writer(f)
            for key, value in self.mydict.items():
                writer.writerow([key, " " + value])

    def enter_personal(self):
        self.clear_window(1)
        Label(self, text = "Select one from the following options", bg = "dim gray", width = "55", height = "2", font = ("Calibri", 15)).grid(column = 0, sticky = W)
        self.expenseAmountEntry = Entry(self); self.expenseAmountEntry.grid(column = 0, sticky = W)
        self.i = -1
        var = IntVar()
        for key in self.mydict.keys():
            self.i += 1
            Radiobutton(self, text = key, variable = var, value = self.i).grid(column = 0, sticky = W)

        Button(self, text = "Submit", command = self.withdraw_expense).grid(column = 0, sticky = W)

    def withdraw_expense(self):
        expenseAmount = self.expenseAmountEntry.get(); del self.expenseAmountEntry
        self.clear_window(1)

        mydictKeys = []
        for key in self.mydict.keys():
            mydictKeys.append(key)

        for x in range(len(mydictKeys)):
            print("x = " + str(x)+ "; self.i = " + str(self.i))
            if mydictKeys[x] == mydictKeys[self.i]:
                self.mydict.update({mydictKeys[self.i]:self.mydictValues[self.i] - expenseAmount})

        Button(self, text = "Exit", command = main_screen.destroy).grid(column = 0, sticky = W)

main_screen = Tk()
main_screen.title("Budget Tracker")
setup_screen(main_screen, 500, 500)
app = Application(main_screen)
main_screen.mainloop()

1 Ответ

1 голос
/ 21 февраля 2020

Если вы позвоните withdraw_expense() перед вызовом distribute(), self.mydictValues не будет установлен.

Вы должны инициализировать его в методе __init__, чтобы он был доступен постоянно.

    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        with open("dict.csv", "r") as f:
            self.mydict = dict(csv.reader(f))
        self.create_widgets()
        self.mydictValues = []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...