Как достать значение поля Entry из дочернего окна Tkinter

Есть дочерние окно "Register Form" там поля Entry из которых я хочу получить переменные login и password, но там какая-то ошибка, причем в родительском окне "Login Form" все нормально.

from tkinter import Tk, Label, Entry, Button, StringVar

   
def insert_user(login, password):
    print(f'login: {login} \n passwword: {password}')
    print('its okay')

def submit():
    login = login_var.get()
    password = password_var.get()
    insert_user(login, password)
    login_var.set("")
    password_var.set("")


def open_register_window():
    root2 = Tk()
    root2.title("Register Form")
    root2.geometry("300x250")    
    root2.resizable(False, False)

    Label(root2, text="Login:").grid(row=0, column=0)
    Entry(root2, textvariable=login_var).grid(row=0, column=1)

    Label(root2, text="Password:").grid(row=1, column=0)
    Entry(root2, textvariable=password_var, show='*').grid(row=1, 
    column=1)

    Button(root2, text="Submit", command=submit).grid(row=2, column=1)

    Label(root2, text="Login:").grid(row=0, column=0)
    Entry(root2, textvariable=login_var).grid(row=0, column=1)

    Label(root2, text="Password:").grid(row=1, column=0)
    Entry(root2, textvariable=password_var, show='*').grid(row=1, column=1)

    Button(root2, text="Submit", command=submit).grid(row=2, column=1)  


root = Tk()
root.title("Login Form")


login_var = StringVar()
password_var = StringVar()

Label(root, text="Login:").grid(row=0, column=0)
Entry(root, textvariable=login_var).grid(row=0, column=1)

Label(root, text="Password:").grid(row=1, column=0)
Entry(root, textvariable=password_var, show='*').grid(row=1, column=1)

Button(root, text="Submit", command=submit).grid(row=2, column=1)

Button(root, text="Create new account", command=open_register_window).grid(row=3, 
column=1)

root.mainloop()

Ответы (1 шт):

Автор решения: Amgarak

Начнём с того, что должно быть только одно главное окно и создавать второе окно через root2 = Tk() не правильно! Нужно делать -> root2 = tk.Toplevel(root)

Так же не нужно завязывать поля login_var = StringVar() и password_var = StringVar() на все новые окна одновременно. Лучше для каждого окна создать свои объекты.

Немного подшаманил вам код, но задумайтесь о рефакторинге:

from tkinter import Tk, Label, Entry, Button, StringVar, Toplevel

   
def insert_user(login, password):
    print(f'login: {login} \n passwword: {password}')
    print('its okay')

def submit():
    login = login_var.get()
    password = password_var.get()
    insert_user(login, password)
    login_var.set("")
    password_var.set("")

def open_register_window():
    def submit2():
        login = login_var2.get()
        password = password_var2.get()
        insert_user(login, password)
        login_var2.set("")
        password_var2.set("")
        
    root2 = Toplevel(root)
    root2.title("Register Form")
    root2.geometry("300x250")    
    root2.resizable(False, False)
    
    login_var2 = StringVar()
    password_var2 = StringVar()

    Label(root2, text="Login:").grid(row=0, column=0)
    Entry(root2, textvariable=login_var2).grid(row=0, column=1)

    Label(root2, text="Password:").grid(row=1, column=0)
    Entry(root2, textvariable=password_var2, show='*').grid(row=1, 
    column=1)

    Button(root2, text="Submit", command=submit2).grid(row=2, column=1)  

root = Tk()
root.title("Login Form")

login_var = StringVar()
password_var = StringVar()

Label(root, text="Login:").grid(row=0, column=0)
Entry(root, textvariable=login_var).grid(row=0, column=1)

Label(root, text="Password:").grid(row=1, column=0)
Entry(root, textvariable=password_var, show='*').grid(row=1, column=1)

Button(root, text="Submit", command=submit).grid(row=2, column=1)
Button(root, text="Create new account", command=open_register_window).grid(row=3, 
column=1)

root.mainloop()

введите сюда описание изображения

→ Ссылка