Класс Python: глобальное / локальное имя переменной не определено

У меня есть два набора кода, один из которых я использую «Класс» (второй кусок кода) для управления моим кодом, а другой – просто определяю функции, в моей второй части кода я получаю имя NameError: global name … ' не определен. Обе части кода предназначены для той же цели.

from Tkinter import * import ttk import csv USER_LOGIN = "user_login.csv" class Login: def __init__(self, master): frame = Frame(master) frame.pack() lment1 = StringVar() lment2 = StringVar() self.usernameLabel = Label(frame, text="Username:") self.usernameLabel.grid(row=0, sticky=E) self.passwordLabel = Label(frame, text="Password:") self.passwordLabel.grid(row=1, sticky=E) self.usernameEntry = Entry(frame, textvariable=lment1) self.usernameEntry.grid(row=0, column=1) self.passwordEntry = Entry(frame, textvariable=lment2) self.passwordEntry.grid(row=1, column=1) self.loginButton = ttk.Button(frame, text="Login", command=self.login_try) self.loginButton.grid(row=2) self.cancelButton = ttk.Button(frame, text="Cancel", command=frame.quit) self.cancelButton.grid(row=2, column=1) def login_try(self): ltext1 = lment1.get() ltext2 = lment2.get() if in_csv(USER_LOGIN, [ltext1, ltext2]): login_success() else: login_failed() def in_csv(fname, row, **kwargs): with open(fname) as inf: incsv = csv.reader(inf, **kwargs) return any(r == row for r in incsv) def login_success(): print 'Login successful' tkMessageBox.showwarning(title="Login successful", message="Welcome back") def login_failed(): print 'Failed to login' tkMessageBox.showwarning(title="Failed login", message="You have entered an invalid Username or Password") root = Tk() root.geometry("200x70") root.title("title") app = Login(root) root.mainloop() 

Это вторая часть кода ^^^

 # **** Import modules **** import csv from Tkinter import * import ttk import tkMessageBox # **** Declare Classes **** lGUI = Tk() lment1 = StringVar() lment2 = StringVar() USER_LOGIN = "user_login.csv" def in_csv(fname, row, **kwargs): with open(fname) as inf: incsv = csv.reader(inf, **kwargs) return any(r==row for r in incsv) def login_try(): ltext1 = lment1.get() ltext2 = lment2.get() if in_csv(USER_LOGIN, [ltext1, ltext2]): login_success() else: login_failed() def login_success(): print 'Login successful' tkMessageBox.showwarning(title="Login successful", message="Welcome back") def login_failed(): print 'Failed to login' tkMessageBox.showwarning(title="Failed login", message="You have entered an invalid Username or Password") lGUI.geometry('200x100+500+300') lGUI.title('PVH') lButton = Button(lGUI, text="Login", command=login_try) lButton.grid(row=3) label_1 = Label(lGUI, text="Username") label_2 = Label(lGUI, text="Password") entry_1 = Entry(lGUI, textvariable=lment1) entry_2 = Entry(lGUI, textvariable=lment2) label_1.grid(row=0) label_2.grid(row=1) entry_1.grid(row=0, column=1) entry_2.grid(row=1, column=1) lGUI.mainloop() 

И это кусок кода, который работает ^

Я получаю сообщение об ошибке:

 Exception in Tkinter callback Traceback (most recent call last): File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__ return self.func(*args) File "C:/Users/User/Desktop/PVH_work/PVH_program/blu.py", line 33, in login_try ltext1 = lment1.get() NameError: global name 'lment1' is not defined 

Любая помощь будет оценена: D

One Solution collect form web for “Класс Python: глобальное / локальное имя переменной не определено”

В вашей первой части кода вы определяете переменную lment1 в методе __init __, делая ее локальной для этого единственного метода. Когда вы пытаетесь получить доступ к той же переменной в «login_try», Python не знает, что это такое.

Если вы хотите получить доступ к форме переменной везде, где есть класс, вы должны определить ее на уровне класса, установив ее на «self»,

 def __init__(self, master): [...] self.lment1 = StringVar() [...] 

Таким образом, вы можете получить к нему доступ позже:

 def login_try(self): [...] ltext1 = self.lment1.get() [...] 

Причина, по которой он работает во втором примере кода, заключается в том, что вы определили его вне любого класса – сделав его доступным по всему миру

Python - лучший язык программирования в мире.