我对Python非常陌生,所以毫无疑问有几个非常基本的错误,虽然我已经浏览了几个Python教程,但一切似乎都没问题。
我正在尝试将两个文本文件导入到我的列表中。
username.txt
看起来像这样
USER1
用户2
user3
并且password.txt
看起来像这样
PASS1
PASS2
pass3
当我运行所有内容时,调试器没有给我任何错误,但是当我尝试user/password
组合时,它说它不正确。
你能看到任何错误,或者知道任何有用的东西吗?
这就是我正在运行的:
from Tkinter import *
username = ["nathan"]
password = ["1"]
def login():
index = 0
usrnm = usernameEntry.get()
while index < len(username):
if username[index] == usrnm:
psswrd = passwordEntry.get()
if password[index] == psswrd:
print("Success")
break
else:
print("Password doesn't exist!")
break
else:
index = index + 1
else:
print("Username doesn't exist!")
def save():
fWUsername = open("username.txt", "w")
fWUsername.write("\n".join(str(x) for x in username))
fWUsername.close
fWPassword = open("password.txt", "w")
fWPassword.write("\n".join(str(x) for x in password))
fWPassword.close
def load():
fRUsername = open("username.txt", "r")
username = fRUsername.readlines()
fRUsername.close()
fRPassword = open("password.txt", "r")
password = fRPassword.readlines()
fRPassword.close()
loginForm = Tk()
usernameLabel = Label(loginForm, text = "username:")
usernameLabel.pack()
usernameEntry = Entry(loginForm)
usernameEntry.pack()
passwordLabel = Label(loginForm, text = "password:")
passwordLabel.pack()
passwordEntry = Entry(loginForm, show = "*")
passwordEntry.pack()
submitButton = Button(loginForm, text = "submit", command = login)
submitButton.pack()
loadButton = Button(loginForm, text = "load data lists", command = load)
loadButton.pack()
saveButton = Button(loginForm, text = "save data lists", command = save)
saveButton.pack()
mainloop()
答案 0 :(得分:1)
这实际上是你在这里遇到的一个问题,因为它根本不是很明显。作为提示,您可以在代码中轻松打印一些其他信息,以便了解出现了什么问题。
在这种情况下,我在登录功能的开头放了一个print(username)
,看到只有nathan
是有效用户,虽然我之前点击了加载按钮。
那发生了什么事?
变量username
和password
都是在模块的根目录(脚本)中定义的;这使他们成为全局变量。可以从模块内的任何位置访问全局变量 - 除非它们被同名的局部变量隐藏。现在,虽然可以从任何地方访问它们,但默认情况下无法更改它们。
所以在你的load
函数中,你有这个:
username = fRUsername.readlines()
这将在您的函数中声明一个 local 变量,隐藏全局变量。当函数结束时,该局部变量被丢弃;但是你的全局变量没有变化。
要更改此行为,您可以定义要使用全局变量username
和password
。为此,请在函数开头为它们添加一个全局语句:
def load():
global username, password
username = ... # this now changes the _global_ variable
如果这样做,全局变量会被正确更改,所有用户名都可以从登录功能中获得。
但是,readlines
将在每行后包含换行符。因此,用户名实际上是user1\n
,user2\n
和user3
(与密码相同)。要解决这个问题,您可能需要在比较它们之前strip()
这些值(删除所有前导和尾随空格)。
最后,建议在打开文件时使用with
语句。这将确保句柄正确关闭(你不需要明确地调用close()
- 你没有在保存方法中执行btw!):
with open('username.txt', 'r') as fRUsername:
username = fRUsername.readlines()
答案 1 :(得分:0)
乍一看,代码看起来是正确的。解决这类问题的一个好方法是添加日志记录,以确保代码在运行时符合您的预期。将日志记录视为允许您随后调试问题的协议。这是一项非常有用的技能。
在您的情况下,您应该在加载用户名和密码后添加日志记录(打印您加载的数量)。如果这两个数字不一致或两者都是1,那么你就已经知道出了什么问题。
稍后,在搜索用户和密码时,请打印索引和预期密码。
注意:出于安全原因,您不应在记录期间打印密码。日志文件通常只受到弱保护。