@dimasik24na7

Python как реализовать вложенные функции в модуле tkinter?

Имеется начальное окно где нужно выбрать войти или пройти регистрацию. Если нажимаем зарегистрироваться - появляется окно регистрации, далее введенные данные сохраняются в текстовый документ intro() -> registration() -> save().
Проблема в том, что функция save() не видит переменных login и password и выдает ошибки:
Traceback (most recent call last):
  File "C:\Users\Admin\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "E:/Python/Test/authorization.py", line 38, in <lambda>
    button_register = Button(text = 'Зарегистрироваться!', command = lambda : save())
  File "E:/Python/Test/authorization.py", line 72, in save
    data = [login.get(), password.get()]
NameError: name 'login' is not defined


from tkinter import *


root = Tk()
root.geometry('500x500')
root.title('Вход\Регистрация')



def registration():
    title_reg = Label(text = 'Зарегистрироваться в системе')
    text1_reg = Label(text= 'Придумайте логин: ')
    login  = Entry()
    text2_reg = Label(text= 'Придумайте пароль: ')
    password  = Entry()
    text3_reg = Label(text = 'Введите пароль еще раз: ')
    password2 = Entry(show = '*')
    button_register = Button(text = 'Зарегистрироваться!', command = lambda : save())
    title_reg.pack()
    text1_reg.pack()
    login.pack()
    text2_reg.pack()
    password.pack()
    text3_reg.pack()
    password2.pack()
    button_register.pack()

def authorize():
    title_login = Label(text = 'Войти в систему')
    text1_login = Label(text= 'Введите логин: ')
    login  = Entry()
    text2_login = Label(text= 'Введите пароль: ')
    password  = Entry()
    button_login = Button(text = 'Войти!', command = lambda : save())
    title_login.pack()
    text1_login.pack()
    login.pack()
    text2_login.pack()
    password.pack()
    button_login.pack()

def intro():
    title_intro = Label(text = 'Войдите или зарегистрируйтесь чтобы продолжить', )
    button_register_intro = Button(text = 'Зарегистрироваться', command = lambda : registration())
    button_login_intro = Button(text = 'Войти', command = lambda : authorize())
    title_intro.pack()
    button_login_intro.pack()
    button_register_intro.pack()


def save():
    data = [login.get(), password.get()]
    file = open('database.txt', 'a')
    for line in data:
        file.write(line + '\n')

intro()

root.mainloop()
  • Вопрос задан
  • 361 просмотр
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Естественно, они же локальные для функции authorize. Либо объявите для окна класс, сделайте все функции его методами, а вместо переменных используйте поля, либо передавайте переменные в функцию.

button_login = Button(text = 'Войти!', command = lambda : save(login, password))

def save(login, password):
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы