Home > Enterprise >  subroot window editing - tkinter
subroot window editing - tkinter

Time:04-15

I'm sure this is going to amount to my misunderstanding of what I'm calling. So I'm trying to make edits to a second window but I don't know that I'm doing it right as it doesn't appear to change. Under def open_win() I created a second window registration(which is supposed to be the equivalent of root). I got the second window to take the Screen position/size but for some reason it wont add the label/entry

from tkinter import *
from functools import partial

#outputs to IDLE
def validateLogin(username, password):
    print("username entered :", username.get())
    print("password entered :", password.get())
    return
#centering Registration page
def open_win():
    registration=Toplevel(root)
    registration.title("Registration Page")
    window_width=600
    window_height=400
    screen_width =registration.winfo_screenwidth()
    screen_height =registration.winfo_screenheight()
    center_x=int(screen_width/2-window_width/2)
    center_y=int(screen_height/2-window_height/2)
    registration.geometry(f'{window_width}x{window_height} {center_x} {center_y}')
#registration label and text entry box
usernameLabel=Label(registration, text="User Name").grid(row=0, column=1)
username=StringVar()
usernameEntry=Entry(registration, textvariable =UserName).grid(row=0, column=2)



#Root Window
root=Tk()  
root.title('Sign in Page')

#centering window
window_width=600
window_height=400
screen_width =root.winfo_screenwidth()
screen_height =root.winfo_screenheight()
center_x=int(screen_width/2-window_width/2)
center_y=int(screen_height/2-window_height/2)
root.geometry(f'{window_width}x{window_height} {center_x} {center_y}')


#username label and text entry box
usernameLabel=Label(root, text="User Name").grid(row=0, column=1)
username=StringVar()
usernameEntry=Entry(root, textvariable=username).grid(row=0, column=2)

#password label and password entry box
passwordLabel=Label(root,text="Password").grid(row=1, column=1)  
password=StringVar()
passwordEntry=Entry(root, textvariable=password, show='*').grid(row=1, column=2)

validateLogin=partial(validateLogin, username, password)

#login button
loginButton=Button(root, text="Login", command=validateLogin).grid(row=4, column=1)  
SignUpButton=Button(root, text="Sign up", command=open_win).grid(row=4, column=2)  

#registration label and text entry box
usernameLabel=Label(registration, text="User Name").grid(row=0, column=1)
username=StringVar()
usernameEntry=Entry(registration, textvariable =UserName).grid(row=0, column=2)

root.mainloop()

CodePudding user response:

Your main issue with not being able to work with the 2nd window is basically a issue of namespace. Your registration variable is stored in the local namespace of the function. If you want to edit it from outside the function like you attempt to do then you need your variable to be in the global namespace.

Because you appear to try and write the same label and entry field a couple of times to the registration top window then I suspect you do not actually need to edit it from outside the function but need to edit it when you created the window.

I have cleaned up your code a little and condensed it to make it a little easier to read.

  1. You should first import tkinter ask tk instead of importing *. This will help prevent any issue with overwriting imports down the road and it makes it a little easier to ID what is referencing a tk widget or some other function.
  2. You use 2 different naming conventions in your code. Chose one and stick with that. It will improve readability. I recommend following PEP8 guidelines.
  3. Items that are not going to be changed later do not need to have variables assigned to them so you can clean up your code a bit there also.
  4. You do not need to go the extra mile to use StringVar here. We can simply pull directly from the entry field as long as the geometry manager (ie grid()) is assigned on a new line so you can still access the variable reference for the entry field.
  5. I am not sure what you were needing partial() for and I think you should use lambda instead in this situation.

If you have any questions let me know.

import tkinter as tk


def validate_login(username, password):
    print("username entered :", username.get())
    print("password entered :", password.get())


def open_win():
    reg = tk.Toplevel(root)
    reg.title("Registration Page")
    reg.geometry(f'600x400 {int(reg.winfo_screenwidth()/2-600/2)} {int(reg.winfo_screenheight()/2-400/2)}')

    tk.Label(reg, text="User Name").grid(row=0, column=1)
    r_un = tk.Entry(reg)
    r_un.grid(row=0, column=2)


root = tk.Tk()
root.title('Sign in Page')
root.geometry(f'600x400 {int(root.winfo_screenwidth()/2-600/2)} {int(root.winfo_screenheight()/2-400/2)}')

tk.Label(root, text="User Name").grid(row=0, column=1)
un = tk.Entry(root)
un.grid(row=0, column=2)

tk.Label(root, text="Password").grid(row=1, column=1)
pw = tk.Entry(root, show='*')
pw.grid(row=1, column=2)

tk.Button(root, text="Login", command=lambda u=un, p=pw: validate_login(u, p)).grid(row=4, column=1)
tk.Button(root, text="Sign up", command=open_win).grid(row=4, column=2)

root.mainloop()
  • Related