【发布时间】:2022-01-14 19:38:57
【问题描述】:
我很新。还没到“课堂”。在我继续前进之前只是想了解功能。尝试制作一个基本的登录小部件,当单击注册按钮时,它会破坏根窗口,启动注册窗口,然后单击提交按钮后,它会获取条目信息,现在只打印它。我有一个可以工作的文件,但只有一个 Tk() 窗口。一旦添加了另一个类似 register 函数,代码就不再起作用了。我认为这一定是我不理解概念的操作顺序,所以我需要一些帮助。我什至尝试将变量“username_var,password_var”放入 register 函数中,因为它们最初位于函数之外,但这也不起作用。还尝试在 register 函数中调用全局变量,但那里也没有运气。我工作了在这两天,所以请不要认为我没有尽我所能。如果您知道我可以阅读以更好地理解这一点的任何文档,请告诉我。我找不到任何东西关于这个话题。
from tkinter import *
# The first widget/container, not resizable
root = Tk()
root.resizable(False, False)
# variables to store the usernames and passwords
username_var = StringVar()
password_var = StringVar()
password2_var = StringVar()
''' Submit logic, if submit button is clicked or enter is pressed and username does not exist in variable list user_name and both password entries match, save username and password in variable list. '''
def submit():
print('Your username is ' + username_var.get())
if password_var == password2_var:
print('Your password is ' + password_var.get())
else:
print('Passwords do not match')
''' register button logic(if register button is clicked, destroy root window, load register window. Register window will have one username and two password labels and entries, entries have textvariables, rw = register window '''
def register_user():
root.destroy()
register_window = Tk()
rw_user_label = Label(register_window, text='Username')
rw_user_label.grid(row=0, column=0)
rw_pass_label = Label(register_window, text='Password')
rw_pass_label.grid(row=1, column=0)
rw_pass_label = Label(register_window, text='Password')
rw_pass_label.grid(row=2, column=0)
rw_user_entry = Entry(register_window, textvariable=username_var)
rw_user_entry.grid(row=0, column=1)
rw_pass_entry = Entry(register_window, textvariable=password_var, show='*')
rw_pass_entry.grid(row=1, column=1)
rw_pass_entry2 = Entry(register_window, textvariable=password2_var, show='*')
rw_pass_entry2.grid(row=2, column=1)
submit_button = Button(register_window, text='Submit', command=submit)
submit_button.grid(row=3, column=1, sticky='ew')
# username and password labels with grid locations
user_label = Label(root, text='Username')
user_label.grid(row=0, column=0)
pass_label = Label(root, text='Password')
pass_label.grid(row=1, column=0)
# username and password entries with grid locations
user_entry = Entry(root)
user_entry.grid(row=0, column=1)
pass_entry = Entry(root, show='*')
pass_entry.grid(row=1, column=1)
# Login and Register buttons with grid locations, both call functions
login_button = Button(root, text='Login')
login_button.grid(row=2, column=1, sticky='ew')
register_button = Button(root, text='Register', command=register_user)
register_button.grid(row=3, column=1, sticky='ew')
# creates an infinite loop for main root widget until destroy function is called or the widget is exited out of
root.mainloop()
【问题讨论】:
-
我看到的两个问题:创建
Tk()的多个实例会导致无效的变量(以及其他各种问题),使用Toplevel()来创建额外的窗口。而且您必须在 Tkinter 变量上调用.get()以检索它们的当前值 - 您在某些地方这样做,但您也在做类似password_var == password2_var之类的事情,这些事情只会返回 False(您不是在比较内容)。 -
推荐测试每一步的调试技术——这样你就知道什么是有效的,唯一的问题是新的步骤。这对于初学者来说似乎很乏味,但从长远来看,随着您的学习变得非常高效。
-
@jasonharper 当我使用 Toplevel() 时,它会在我的注册窗口顶部生成一个空白窗口。这是故意的吗?
-
@InhirCode,有没有你推荐的学习如何编写测试用例的资源。我认为我在此过程中做得足够好,但不确定。您在我的代码中没有看到任何内容,因为我通常会编写一个测试用例,如果它通过了,我就将其删除。
-
好吧,我个人不使用测试用例 - 使用 print 和 pass 足以检查大多数事情,包括测试事情的去向、类型和值检查以及结果。保持它非常简单也是对基本设计的一个很好的测试。 Python 确实有 unitest 模块,您可以在 Python 文档中了解它是否更适合您。