习题7-5,登陆系统。
代码:
#-*-coding: utf-8-*-
# 图形界面等到学完Tkinter之后再完善
import time, msvcrt, sys
db = {}
user = {} # 建立存储单个用户的账号、密码和登录时间的字典
# 这个是在网上找到的python密码回显的函数,经测试可行
def pwd_input():
chars = []
while True:
newChar = msvcrt.getch()
if newChar in '\r\n': # 如果是换行,则输入结束
print ''
break
elif newChar == '\b': # 如果是退格,则删除末尾一位
if chars:
del chars[-1]
sys.stdout.write('\b \b') # 删除一个星号
else:
chars.append(newChar)
sys.stdout.write('*') # 显示为星号
def newuser():
prompt = "login desired and case-insensitive: "
while True:
name = raw_input(prompt)
if name.isalnum():
if db.has_key(name.lower()): # 用户名全部以小写形式存入字典中
prompt = "name taken, try another: "
else:
break
else:
print "Your name has invalid char."
print "Enter your password:"
pwd = pwd_input()
db[name.lower()] = pwd
user['ID'] = name # 记录用户登陆的账号
user['password'] = pwd # 记录用户登陆的密码
user['login_time'] = time.time() # 记录用户第一次登陆的时间
def olduser():
name = raw_input("login ignoring case: ")
print "Enter your password:"
pwd = pwd_input()
passwd = db.get(name.lower())
if passwd == pwd:
print "welcome back", name
last_login_time = user['login_time'] # 记录用户上次登陆时间
user['login_time'] = time.time() # 记录用户本次登录时间
time_delta = user['login_time'] - last_login_time # 求两次登陆时间差,以时间戳表示
if time_delta <= 4 * 60 * 60: # 本次登录时间与上次登录时间少于4小时,显示上次登录时间。
print "You already logged in at: {0}".format(time.ctime(last_login_time))
else:
print "login incorrect."
def manage():
while True:
try:
option = int(raw_input("Enter 1 or 2: "))
except ValueError,e:
print "*** Input error:", e
else:
if option in range(1, 3):
break
else:
print "Enter the right number."
if option == 1:
name = raw_input("Enter a name you want to delete: ") # 输入要删除用户的名字
db.pop(name, "This name does not exit!")
else:
for k, v in iteritems(db):
print k, v
def showmenu():
prompt = """
(U)ser Login
(M)anage
(Q)uit
Enter choice: """
done = False
while not done:
chosen = False
while not chosen:
try:
choice = raw_input(prompt).strip()[0].lower()
except (EOFError, KeyboardInterrupt):
choice = 'q'
print "\nYou picked: [%s]" % choice
if choice not in 'umq':
print "invalid option, try again."
else:
chosen = True
if choice == 'u':
while True:
u = raw_input("Are you newuser or olduser? Enter n or o: ")
if u == 'n':
newuser()
break
elif u == 'o':
olduser()
break
else:
print "Enter the givern char."
elif choice == 'm':
manage()
else:
done = True
if __name__ == "__main__":
showmenu()
注意python中密码回显的函数。