Python 如何将用户输入添加到列表中,并将该列表相加?

Python 如何将用户输入添加到列表中,并将该列表相加?,python,python-3.x,list,Python,Python 3.x,List,我正在运行一个跟踪用户费用的程序。我已经完成了大部分,但需要最关键的部分。当我运行该程序时,我得到一条错误消息:a1未定义。以下是我所拥有的: class Expense(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) home = Label(self, text = "Home: ") home.g

我正在运行一个跟踪用户费用的程序。我已经完成了大部分,但需要最关键的部分。当我运行该程序时,我得到一条错误消息:a1未定义。以下是我所拥有的:

class Expense(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        home = Label(self, text = "Home: ")
        home.grid(row = 3, column = 0)
        util = Label(self, text = "Utilities: ")
        util.grid(row = 4, column = 0)
        health = Label(self, text = "Health/Medical: ")
        health.grid(row = 5, column = 0)
        food = Label(self, text = "Food: ")
        food.grid(row = 6, column = 0)
        transport = Label(self, text = "Transportation: ")
        transport.grid(row = 7, column = 0)
        
        a1 = Entry(self).grid(row = 3, column = 1)
        a2 = Entry(self).grid(row = 4, column = 1)
        a3 = Entry(self).grid(row = 5, column = 1)
        a4 = Entry(self).grid(row = 6, column = 1)
        a5 = Entry(self).grid(row = 7, column = 1)
        
        submit = Button(self, text = "Submit", command = self.AddExpenses)
        submit.grid(row = 8, column = 1)

    #Here's where I run an issue.
    def AddExpenses(self):
        expenses = [a1, a2, a3, a4, a5]
        total = 0
        for i in list:
            total = total + i
        print("Your total spent", total)

如果您使用的是类,则需要使用实例变量,以便能够在整个类中使用该变量

您需要在所有这些变量之前使用
self
关键字。比如:

class Expense(tk.Frame):
    def __init__(self, parent, controller):
        self.a = 1
        self.b = 2
这只是一个例子

您应该将代码更改为:

class Expense(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        self.home = Label(self, text = "Home: ")
        self.home.grid(row = 3, column = 0)
        self.util = Label(self, text = "Utilities: ")
        self.util.grid(row = 4, column = 0)
        self.health = Label(self, text = "Health/Medical: ")
        self.health.grid(row = 5, column = 0)
        self.food = Label(self, text = "Food: ")
        self.food.grid(row = 6, column = 0)
        self.transport = Label(self, text = "Transportation: ")
        self.transport.grid(row = 7, column = 0)
        
        self.a1 = Entry(self)
        self.a2 = Entry(self)
        self.a3 = Entry(self)
        self.a4 = Entry(self)
        self.a5 = Entry(self)

        self.a1.grid(row = 3, column = 1)
        self.a2.grid(row = 4, column = 1)
        self.a3.grid(row = 5, column = 1)
        self.a4.grid(row = 6, column = 1)
        self.a5.grid(row = 7, column = 1)
        
        self.submit = Button(self, text = "Submit", command = self.AddExpenses)
        self.submit.grid(row = 8, column = 1)

    #Here's where I run an issue.
    def AddExpenses(self):
        expenses = [
                    self.a1.get(),
                    self.a2.get(),
                    self.a3.get(),
                    self.a4.get(),
                    self.a5.get(),
        ]

        total = 0
        for i in list:
            total = total + i
        print("Your total spent", total)

如果您对使用python进行面向对象编程还不熟悉,您应该首先集中学习这一点,否则
Tkinter
会变得越来越难。

对您的代码进行一些注释

  • 您通常应该使用
    import-tkinter-as-tk
    而不是
    from-tkinter-import*
    ,以避免污染您的命名空间和名称之间存在潜在冲突
  • 在tkinter中定义小部件时,您只能在调用
    pack
    grid
    之前将其分配给变量,因为这些函数返回
    None
  • 如果希望稍后在代码中重用某个小部件,只需将其分配给变量
  • 您不能在新函数中使用变量
    a1、a2、a3、a4、a5
    ,因为该函数不知道这些变量(它们是在另一个函数中定义的-
    \uuuu init\uuu
    )。要在别处检索它们,需要通过
    self
    对象将它们分配给类实例
  • 当您希望从
    AddExpense
    函数中的条目中获取值时,需要调用
    get()
    方法来检索它们
考虑到这一点,您可以尝试下面的代码来获得您想要的

将tkinter作为tk导入
从tkinter导入消息框
课程费用(传统框架):
定义初始化(自、父、控制器):
tk.Frame.\uuuu init\uuuuu(自,父)
tk.Label(self,text=“Home:”).grid(行=3,列=0)
tk.Label(self,text=“Utilities:”).grid(行=4,列=0)
tk.Label(self,text=“Health/Medical:”).grid(行=5,列=0)
tk.Label(self,text=“Food:”).grid(行=6,列=0)
tk.Label(self,text=“Transportation:”).grid(行=7,列=0)
self.a1=传统条目(self)
self.a1.网格(行=3,列=1)
self.a2=传统条目(self)
self.a2.网格(行=4,列=1)
self.a3=传统条目(self)
self.a3.网格(行=5,列=1)
self.a4=传统条目(self)
self.a4.网格(行=6,列=1)
self.a5=传统条目(self)
self.a5.grid(行=7,列=1)
按钮(self,text=“Submit”,command=self.AddExpenses).grid(行=8,列=1)
def附加费用(自身):
费用=[self.a1.get()、self.a2.get()、self.a3.get()、self.a4.get()、self.a5.get()]
总计=总额(map(浮动、费用))
showinfo(“费用”,f“您的总花费为:{total}”)
打印(f“您的总花费为{total}”)
root=tk.tk()
exp=费用(根,无)
exp.pack()
root.mainloop()

嗯,是的,
a1、a2、a3、a4、a5
\uuuu init\uuuuu
的局部变量,所以在这个方法之外它们是不可访问的。OPs代码中还有几个问题没有在您的答案中解决,所以这当然不会work@oskros我只是回答了他的问题不能访问他自己的变量,剩下的应该很容易自己去弄清楚。如果你不知道
grid
是一个返回
None
的空函数,或者你需要调用
get
从entry@oskros谢谢你指出,我没有太注意他的代码,我只解决了他的
self.
问题,只是在每个变量声明中添加了
self.
,而没有阅读代码。我会做一些修改,你能帮我指出他的错误吗。