这是一个简单的登录程序 - 逻辑在VB.Net中工作,但我无法将其转换为Python。 Python代码不起作用,但是Stackoverflow上的两个用户(un_lucky和Jerry)提供的VB.Net代码确实如此。任何人都能指出我的python代码修复程序吗?它基本上产生了一系列拒绝访问"而不是只有一个,当密码不正确,如果用户名或密码是数组中的SECOND,那么它产生一个拒绝访问,然后是访问授权。
count=0
for counter in range(0,len(fields)):
if textlogin.get()==fields[counter] and textpassword.get()==fields[counter+1]:
count=count+1
if count > 0:
welcome=Label(myGui,text="Access Granted. Loading Profile ....")
welcome.pack()
else:
denied=Label(myGui,text="Access Denied")
denied.pack()
这里是VB.net代码(逻辑),除了上面的python程序从文本文件中读取外,它确实可以实现几乎相同的功能。
它现在完美无缺(几乎),但用户名和密码中的空白条目也会产生"访问授权" ...无法找出原因! 以下整个代码:
def verifylogin():
fin=open("moosebook.txt","r")
data=fin.readlines()
for line in data:
fields=line.split()
fields=[i.rstrip("','") for i in fields] #strips the named character from END of field
fields=[i.replace("'",'') for i in fields]#when reading the list, you want to remoe the ',' so it isn't part of the username or password
fields=[i.replace("(",'') for i in fields] #simiarly, remove the bracket and replace it
fields=[i.replace(")",'') for i in fields] #simiarly, remove the bracket and replace it
line=line.rstrip()
print(fields)
flag=0
for counter in range(0,len(fields)):
if textlogin.get()==fields[counter] and textpassword.get()==fields[counter+1]:
flag=flag+1
if flag>0:
welcome=Label(myGui,text="Access Granted. Loading Profile ....")
welcome.pack()
else:
denied=Label(myGui,text="Access Denied")
denied.pack()
答案 0 :(得分:2)
缩进在Python中很重要。您将if
测试放入循环。您需要删除额外的缩进以将其放在循环外:
for counter in range(0,len(fields)):
if textlogin.get()==fields[counter] and textpassword.get()==fields[counter+1]:
count=count+1
if count > 0:
welcome=Label(myGui,text="Access Granted. Loading Profile ....")
welcome.pack()
else:
denied=Label(myGui,text="Access Denied")
denied.pack()
请注意,if
和else
行现在与for
行位于同一列。
因为在您的代码中,if
语句缩进到更深层次(与if
测试检查密码相同),您创建了多次标签,每次运行循环一次
缩进用于分隔代码块,与VB.NET代码使用Next
和End If
明确分隔循环和条件测试的方式相同。
可以清理循环;只调用textlogin.get()
和textpassword.get()
一次,并使用zip()
配对字段值,并any()
查看是否存在第一个匹配(这里就够了) :
login, pw = textlogin.get(), textpassword.get()
if any(pair == (login, pw) for pair in zip(fields, fields[1:])):
welcome=Label(myGui,text="Access Granted. Loading Profile ....")
welcome.pack()
else:
denied=Label(myGui,text="Access Denied")
denied.pack()
如果您打算以对(而不是滑动窗口)遍历字段,请使用:
login, pw = textlogin.get(), textpassword.get()
fields_iter = iter(fields)
if any(pair == (login, pw) for pair in zip(fields_iter, fields_iter)):
welcome=Label(myGui,text="Access Granted. Loading Profile ....")
welcome.pack()
else:
denied=Label(myGui,text="Access Denied")
denied.pack()