from tkinter import *
def main_account_screen():
main_screen = Tk() # create a GUI window
main_screen.geometry("700x450") # set the configuration of GUI window
main_screen.wm_iconbitmap('py.ico')
main_screen.title("Account Login") # set the title of GUI window
# create a Form label
Label(text="Login or Register", bg="red", width="300", height="2", font=("Arial Black", 13,)).pack()
Label(text="").pack()
# create Login Button
Button(text="Login", height="4", width="30", font=("Arial Black", 13,)).pack()
Label(text="").pack()
# create a register button
Button(text="Register", height="4", width="30", font=("Arial Black", 13,)).pack()
main_screen.mainloop() # start the GUI
main_account_screen() # call the main_account_screen() function
def register():
# The Toplevel widget work pretty much like Frame,
# but it is displayed in a separate, top-level window.
# Such windows usually have title bars, borders, and other “window decorations”.
# And in argument we have to pass global screen variable
register_screen = Toplevel(main_screen)
register_screen.title("Register")
register_screen.geometry("300x250")
# Set text variables
username = StringVar()
password = StringVar()
# Set label for user's instruction
Label(register_screen, text="Please enter details below", bg="blue").pack()
Label(register_screen, text="").pack()
# Set username label
username_lable = Label(register_screen, text="Username * ")
username_lable.pack()
# Set username entry
# The Entry widget is a standard Tkinter widget used to enter or display a single line of text.
username_entry = Entry(register_screen, textvariable=username)
username_entry.pack()
# Set password label
password_lable = Label(register_screen, text="Password * ")
password_lable.pack()
# Set password entry
password_entry = Entry(register_screen, textvariable=password, show='*')
password_entry.pack()
Label(register_screen, text="").pack()
# Set register button
Button(register_screen, text="Register", width=10, height=1, bg="blue").pack()
global main_screen
# add command=register in button widget
Button(text="Register", height="2", width="30", command=register).pack()
main_screen.mainloop() # start the GUI
main_account_screen() # call the main_account_screen() function
我对将两个功能(即登录屏幕和实际注册信息的组合)结合起来的理解感到困惑。
只是试图使代码在基本水平上工作,但是我在缩进和任何有助于将代码绑定在一起的事情上都在挣扎。
答案 0 :(得分:0)
您只需要一个Tk()
实例,然后需要一个mainloop()
实例。您无缘无故地在多个部分中拥有主循环。
您正在调用两次构建根窗口的函数。而且实际上应该只在底部调用一次。
您尝试使用global获取根窗口,但是构成根窗口的函数未在全局名称空间中声明它,因此不会做任何有用的事情。
您有很多多余的评论。您无需注释# create Login Button
,这从代码中显而易见。应该保留评论以在需要的地方进行澄清。在阅读时不太明显的一些复杂代码中。您的代码本身就足够了,因为即使不是全部,也不需要大部分注释。
创建变量username = StringVar()
的行不会完全按照您的想法进行。因为您没有像这样username = StringVar(register_screen)
那样告诉它们属于顶层窗口,所以这些变量实际上默认属于tk的主实例,也就是您的根窗口。这可能会导致问题,最近我上次遇到此问题是由于线程。因此,请确保始终声明拥有该变量的内容。
在这种情况下,您无需分配标签,按钮或条目,除非您计划对其进行更改或沿途进行更新。在这种情况下,输入字段可以使用的原因是由于变量分配。我们可以直接从中获取价值。
您不需要添加间隔标签。 IE Label(text="").pack()
。您可以将padding添加到pack语句中,也可以将grid()
与padding一起使用,这是我处理小部件的首选方法。
最后,您应该执行import tkinter as tk
而不是导入*
。这样可以防止方法的任何覆盖,并清楚说明从何处获取窗口小部件/方法。
这是您的代码简化了。如果您有任何疑问,请告诉我。我已将您的75行代码减少到25行。
import tkinter as tk
def register():
top = tk.Toplevel(root)
top.title("Register")
top.geometry("300x250")
username = tk.StringVar(top)
password = tk.StringVar(top)
tk.Label(top, text="Please enter details below", bg="blue").pack()
tk.Label(top, text="Username * ").pack()
tk.Entry(top, textvariable=username).pack(padx=10, pady=10)
tk.Label(top, text="Password * ").pack()
tk.Entry(top, textvariable=password, show='*').pack(padx=10, pady=10)
tk.Button(top, text="Register", width=10, height=1, bg="blue").pack()
root = tk.Tk()
root.geometry("700x450")
root.title("Account Login")
tk.Label(root, text="Login or Register", bg="red", width="300", height="2", font=("Arial Black", 13,)).pack()
tk.Button(root, text="Login", height="4", width="30", font=("Arial Black", 13,)).pack(padx=15, pady=15)
tk.Button(root, text="Register", height="4", width="30", font=("Arial Black", 13,), command=register).pack()
root.mainloop()