#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()
функции, которую вы объявили позже. Без контекста трудно понять, что рекомендовать, но попробуйте:
- Объявление
i
иroot = Tk()
в верхней части скрипта, внеMyFirstGUI
класса, если вы собираетесь добавить больше классов, на которые могут ссылатьсяi
. - If
i
будет использоваться только в контексте первого класса gui, используяself.i
andself.i.get()
. - Другой альтернативой является создание
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. Рад слышать! Пожалуйста, подумайте о том, чтобы отметить наиболее полезный ответ на этой странице как принятый ответ, чтобы помочь другим людям, которые сталкиваются с этим сообщением, если у них такая же проблема.