0

我对 Python 非常陌生,所以毫无疑问有几个非常基本的错误,尽管我已经阅读了几个 Python 教程并且一切似乎都很好。

我正在尝试将两个文本文件导入到我的列表中。

username.txt看起来像这样

用户1 用户 2
用户
3

password.txt看起来像这样


1传2
传3

当我运行所有内容时,调试器不会给我任何错误,但是当我尝试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()
4

2 回答 2

1

这实际上是您在这里遇到的一个平均问题,因为它根本不是很明显。作为提示,您可以轻松地在整个代码中打印一些附加信息,让您了解发生了什么问题。

在这种情况下,我print(username)在登录函数的开头放了一个,发现只有nathan一个有效用户,虽然我之前点击了加载按钮。

那么发生了什么?

变量usernamepassword都定义在模块的根目录(脚本);这使它们成为全局变量。全局变量可以从模块内的任何地方访问——除非它们被同名的局部变量隐藏。现在,虽然可以从任何地方访问它们,但默认情况下无法更改它们。

所以在你的load函数中,你有这个:

username = fRUsername.readlines()

这将在你的函数中声明一个局部变量,隐藏全局变量。当函数结束时,该局部变量被丢弃;但你的全局变量是不变的。

要更改此行为,您可以定义要使用全局变量usernamepassword. 为此,请在函数开头为它们添加一个全局语句:

def load():
    global username, password
    username = ... # this now changes the _global_ variable

如果您这样做,全局变量将正确更改,并且所有用户名都可从登录功能获得。

但是,readlines将在每行之后包含换行符。所以用户名实际上是user1\n, user2\nand user3(与密码相同)。要解决这个问题,您可能需要strip()在比较它们之前对这些值进行比较(删除所有前导和尾随空格)。

最后,一般建议with在打开文件时使用该语句。这将确保句柄正确关闭(您不需要close()显式调用 - 顺便说一句,您没有在 save 方法中这样做!):

with open('username.txt', 'r') as fRUsername:
    username = fRUsername.readlines()
于 2013-09-02T13:03:26.510 回答
0

乍一看,代码看起来是正确的。解决此类问题的一个好方法是添加日志记录,以确保代码在运行时符合您的预期。将日志记录视为一种允许您事后调试问题的协议。这是一个非常有用的技能。

在您的情况下,您应该在加载用户名和密码后添加日志记录(打印您加载的数量)。如果两个数字不一致或都为 1,则您已经知道有问题了。

稍后,在搜索用户和密码时,打印索引和预期的密码。

注意:出于安全原因,您不应在登录期间打印密码。日志文件通常只受到较弱的保护。

于 2013-09-02T13:04:10.167 回答