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'

问题描述 投票:0回答:1
我在另一个函数(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()

完整的错误代码:回溯(最近一次调用最近):文件“ /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/tkinter/__init__.py",__call__中的第1702行返回自己。 func(* args)...
python python-3.x tkinter
1个回答
0
投票
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 = []
© www.soinside.com 2019 - 2024. All rights reserved.