子根 window 编辑 - tkinter

subroot window editing - tkinter

我确定这将构成我对我所称呼的误解。所以我正在尝试对第二个 window 进行编辑,但我不知道我做对了,因为它似乎没有改变。在 def open_win() 下,我创建了第二个 window 注册(这应该等同于 root)。我得到了第二个 window 来获取屏幕 position/size 但由于某种原因它不会添加 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()

无法使用第二个 window 的主要问题基本上是命名空间问题。您的 registration 变量存储在函数的本地命名空间中。如果你想像你尝试做的那样从函数外部编辑它,那么你需要你的变量在全局命名空间中。

因为您似乎尝试将相同的标签和输入字段写入注册顶部几次 window 那么我怀疑您实际上不需要从函数外部编辑它但需要编辑当您创建 window.

我已经稍微清理了你的代码并对其进行了压缩,使其更易于阅读。

  1. 您应该首先 import tkinter ask tk 而不是导入 *。这将有助于防止在以后覆盖导入时出现任何问题,并且可以更轻松地识别引用 tk 小部件或其他功能的内容。
  2. 您在代码中使用了 2 种不同的命名约定。选择一个并坚持下去。它将提高可读性。我建议遵循 PEP8 准则。
  3. 以后不会更改的项目不需要为它们分配变量,因此您也可以在那里稍微清理一下代码。
  4. 在这里使用 StringVar 不需要付出额外的努力。只要几何管理器(即grid())被分配到一个新行,我们就可以直接从输入字段中拉取,这样您仍然可以访问输入字段的变量引用。
  5. 我不确定你需要什么 partial(),我认为在这种情况下你应该使用 lambda。

如果您有任何问题,请告诉我。

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()