Python 所以我在学校项目的Tkinter代码中不断出现这个名字错误,我不太明白为什么

Python 所以我在学校项目的Tkinter代码中不断出现这个名字错误,我不太明白为什么,python,tkinter,nameerror,Python,Tkinter,Nameerror,文件“main.py”,第47行,计算 如果(i.get()==1): 名称错误:未定义名称“i” 这是我一直收到的错误,我不太明白为什么。如果这有帮助的话,我主要是一个初学者。非常感谢您的帮助,以下是代码。它是一个货币转换器,但目前还不完整,因为我不明白错误是什么,如何修复它 #the name of this app is MyFirstGui class MyFirstGUI: def __init__(self, master): self.master = master

文件“main.py”,第47行,计算 如果(i.get()==1): 名称错误:未定义名称“i”

这是我一直收到的错误,我不太明白为什么。如果这有帮助的话,我主要是一个初学者。非常感谢您的帮助,以下是代码。它是一个货币转换器,但目前还不完整,因为我不明白错误是什么,如何修复它


#the name of this app is MyFirstGui
class MyFirstGUI:
  def __init__(self, master):
    self.master = master    
    

    #The title
    self.label_a = Label(master, text="~~~ Currency Converter ~~~")
    self.label_a.pack(padx = 10, pady = 10)  
    

    #Where you would enter the amount of money
    self.label_b = Label(master, text="Enter Amount of Money (CDN)")
    self.label_b.pack()  
    self.money_entry = Entry(master)
    self.money_entry.pack()    

    i = IntVar()
    #These will make bubble buttons appear that you can check
    rad1 = Radiobutton(master,text='US Dollar', value=1, variable=i)
    rad2 = Radiobutton(master,text='British Pound', value=2, variable=i)
    rad3 = Radiobutton(master,text='Chinese Yuan', value=3, variable=i)
    rad4 = Radiobutton(master,text='Euro', value=4, variable=i)
    rad5 = Radiobutton(master,text='South Korean Won', value=5, variable=i)
    rad6 = Radiobutton(master,text='Mexican Peso', value=6, variable=i)
 
    rad1.pack(pady = 5, anchor = 'w')
    rad2.pack(pady = 5, anchor = 'w')
    rad3.pack(pady = 5, anchor = 'w')
    rad4.pack(pady = 5, anchor = 'w')
    rad5.pack(pady = 5, anchor = 'w')
    rad6.pack(pady = 5, anchor = 'w')
    
    self.label_results = Label(master, text="")
    self.label_results.pack(padx = 10, pady = 10)  



    #Button to calculate
    self.button_a = Button(master, text="Calculate!", command=self.calculate)
    self.button_a.pack()   
    
  #Where the calculations take place
  def calculate(self):
     if (i.get() == 1):
      canadian_dollars = float(self.money_entry.get())
      us_dollar = (canadian_dollars * 0.75)
      self.label_results.config(text=("$%.2f Canadian Dollars will be equal to $%.2f when converted to US Dollars." % (canadian_dollars, us_dollar)))
    


root = Tk()
my_gui = MyFirstGUI(root)
root.mainloop()```

出现此错误是因为您没有在正在使用变量i的函数(在计算函数中)中定义变量i


如果要使用与init函数中的i变量相同的i变量,可以使用self.i而不仅仅是i将i作为实例变量,或者您可以将i作为参数传递给您的计算函数。

您在
MyFirstGUI
的初始化函数中声明
i
,但您没有将其范围扩展到包括其他函数,因此
i
无法从您稍后声明的
calculate()
函数访问。没有上下文,很难知道该推荐什么,但请尝试:

  • 在脚本顶部声明
    i
    root=Tk()
    ,在
    MyFirstGUI
    类之外,如果您想添加更多可能引用
    i
    的类
  • If
    i
    将仅在第一个gui类的上下文中使用,使用
    self.i
    self.i.get()
  • 另一种选择是使
    i
    成为一个全局的,但这通常是不鼓励的
  • 如果您不打算添加更多引用
    i
    的类,那么重命名为
    self.i
    ,以便
    i
    继承
    MyFirstGUI
    的范围将是最合适的方法


    如果您希望在单个函数的范围之外使用
    i
    (例如跨
    \uuu init\uuu()
    calculate()
    使用
    i
    ,那么我也强烈建议您将
    i
    重命名为更具体的名称。

    i
    \uu init\uu>中的局部变量
    和so不能在
    calculate()
    内访问。请将
    i
    更改为
    self.i
    (或使用
    i
    以外的更好名称)。非常感谢您的快速响应!我实际上还没有学习全局变量。如果您不介意解释的话,我该怎么做?不要在这个应用程序中使用全局变量。请将程序中的
    i
    重命名为
    self.i
    ,正如@Ken所建议的。对不起,我不是指全局变量,我指的是实例变量。您可以使用实例变量,将所有的“i”替换为“self.i”AttributeError:“NoneType”对象没有属性“\u root”我通过在顶部声明“i”得到了这个错误编辑:我得到了它我的道歉,它应该在下面
    root=Tk()
    as
    IntVar()
    是一个需要根的tkinter类。请尝试将
    i
    的定义移动到
    root
    声明的下方。如有必要,您可能需要将
    root
    的声明移动到脚本的顶部。但只有在
    i
    将在
    MyFirstGUI
    之外使用时,甚至然后违背了好的OOP实践——在<代码> MyFirstGUI < /代码>的范围内声明<代码> i <代码>,并允许它继承<代码>自我>代码>。这是一个更明智的方法。很高兴听到!请考虑把这个页面上最有用的响应标记为一个被接受的答案,以帮助其他遇到这篇文章的人,如果他们有相同的答案的话。问题