итак, я продолжаю получать эту ошибку имени в моем коде Tkinter для школьного проекта, и я не совсем понимаю, почему

#python #tkinter #nameerror

#python #tkinter #ошибка имени

Вопрос:

Файл «main.py «, строка 47, в calculate if (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()```
  

Комментарии:

1. i является локальной переменной внутри __init__() и поэтому не может быть доступна внутри calculate() . Измените i на self.i (или лучше назовите другое, чем i ).

Ответ №1:

Вы получаете эту ошибку, потому что вы не определяете переменную i в функции, в которой вы ее используете (в функции calculate ).

Если вы хотите использовать ту же переменную i, что и в вашей функции init, вы можете либо сделать i переменной экземпляра, используя self.i вместо просто i, либо вы можете передать i в качестве параметра в свою функцию calculate .

Комментарии:

1. большое вам спасибо за быстрый ответ! на самом деле я еще не узнал о глобальных переменных. как мне это сделать, если вы не возражаете объяснить?

2. Не используйте глобальные переменные для этого приложения. Переименуйте i в своей программе self.i , как предлагает @Ken .

3. извините, я не имел в виду глобальную переменную, я имел в виду переменную экземпляра. Вы можете использовать переменную экземпляра, заменив все ваши «i» на «self.i»

Ответ №2:

Вы объявляете i в функции инициализации MyFirstGUI , но не расширяете ее область действия, чтобы включить другие функции, поэтому i она недоступна из calculate() функции, которую вы объявили позже. Без контекста трудно понять, что рекомендовать, но попробуйте:

  1. Объявление i и root = Tk() в верхней части скрипта, вне MyFirstGUI класса, если вы собираетесь добавить больше классов, на которые могут ссылаться i .
  2. If i будет использоваться только в контексте первого класса gui, используя self.i and self.i.get() .
  3. Другой альтернативой является создание i глобального, но это, как правило, настоятельно не рекомендуется.

Если вы не собираетесь добавлять больше классов, на которые ссылаются i , то переименование в self.i so, которое i наследует область действия MyFirstGUI , было бы наиболее подходящим подходом.

Если вы хотите использовать i вне области действия одной функции (например, для обоих __init__() , и calculate() тогда я бы также настоятельно рекомендовал вам переименовать i во что-то более конкретное.

Комментарии:

1. AttributeError: объект ‘NoneType’ не имеет атрибута ‘_root’ я получаю эту ошибку, объявляя i вверху Редактировать: я заставил это работать

2. Мои извинения, это должно быть ниже root = Tk() , поскольку IntVar() это класс tkinter, которому нужен root. Попробуйте переместить определение i в ниже объявления root . При необходимости вам может потребоваться переместить объявление root в начало скрипта. Это оправдано, только если i когда-либо будет использоваться за пределами MyFirstGUI though , и даже тогда это противоречит хорошей практике ООП — объявление i в рамках MyFirstGUI и разрешение ему наследоваться self является более разумным подходом.

3. Рад слышать! Пожалуйста, подумайте о том, чтобы отметить наиболее полезный ответ на этой странице как принятый ответ, чтобы помочь другим людям, которые сталкиваются с этим сообщением, если у них такая же проблема.