Python密码报警五分钟

Python password alarm for five minutes

我为游戏编写了这个python程序:

print("CC ACTIVATED")
import lcddriver
import time
import subprocess
display = lcddriver.lcd()
try:
    display.lcd_display_string("CC... ", 1) 
    time.sleep(2)
    display.lcd_display_string("ONLINE", 2)
    time.sleep(2)
    display.lcd_clear()
except Exception:
    print("SCREEN ERROR")
try:
    display.lcd_display_string("SETUP A", 1) 
    display.lcd_display_string("PASSWORD? Y/N", 2)
except Exception:
    print("SCREEN ERROR")
activate = input("")
if activate == 'y':
    print("ACTIVATED")
    try:
        display.lcd_clear()
        display.lcd_display_string("", 1) 
        time.sleep(2)
        display.lcd_display_string("LOADING", 2)
        time.sleep(2)
        display.lcd_clear()
    except Exception:
        print("SCREEN ERROR")

else:
    print("ABORT")
    try:
        display.lcd_clear()
        display.lcd_display_string("", 1) 
        time.sleep(2)
        display.lcd_display_string("ABORT", 2)
        time.sleep(2)
        display.lcd_clear()
        subprocess.call(["sudo","halt"])
    except Exception:
        print("SCREEN ERROR")
        subprocess.call(["sudo","halt"])
k = True
while k:
    
    try:
        display.lcd_clear()
        display.lcd_display_string("ENTER PASWORD", 1) 
        display.lcd_display_string("----------------", 2)
    except Exception:
        print("SCREEN ERROR")
    pasword = input("")
    display.lcd_clear()
    try:
        display.lcd_clear()
        display.lcd_display_string("YOU TYPED:", 1) 
        display.lcd_display_string(pasword, 2)
        time.sleep(2)
        display.lcd_display_string("CONFIRM? Y/N", 1) 
    except Exception:
        print("SCREEN ERROR")
    ok = input("")
    if ok == 'y':
        k = False
    else:
        display.lcd_clear()
try:
    display.lcd_clear()
    display.lcd_display_string("PASSWORD", 1) 
    display.lcd_display_string("SET", 2)
except Exception:
    print("SCREEN ERROR")
time.sleep(2)
run = True
try:
    display.lcd_clear()
    display.lcd_display_string("STARTING ", 1) 
    display.lcd_display_string("GAME...", 2)
except Exception:
    print("SCREEN ERROR")
time.sleep(2)
while run:
    try:
        display.lcd_clear()
        display.lcd_display_string("ENTER PASSWORD ", 1) 
        display.lcd_display_string("TO DEACTIVATE", 2)
    except Exception:
        print("SCREEN ERROR")
    pasword1 = input("")
    if pasword1 == pasword:
        try:
            display.lcd_clear()
            display.lcd_display_string("PASSWORD....", 1)
            time.sleep(2)
            display.lcd_display_string("ACCEPTED", 2)
            time.sleep(2)
            display.lcd_clear()
            display.lcd_display_string("DEACTIVATED", 2)
            subprocess.call(["sudo","halt"])
            time.sleep(10)
        except Exception:
            print("SCREEN ERROR")
            subprocess.call(["sudo","halt"])
    else:
        try:
            display.lcd_clear()
            display.lcd_display_string("PASSWORD....", 1)
            time.sleep(2)
            display.lcd_display_string("UNACCEPTED", 2)
            time.sleep(2)
        except Exception:
            print("SCREEN ERROR")

它在 raspberry pi 上运行并且工作得非常好,但是我想做的一件事有点超出我的技能水平。我需要这个程序给你三次猜测密码的尝试,然后在第四次尝试时播放一段录音。之后,它需要用五分钟的录音来回应失败的尝试,然后再回到沉默的三次机会。我知道如何让它进行录音,但我需要五分钟部分的帮助。这里有人知道怎么做吗?谢谢

要允许三次密码尝试,您需要一个计数器变量,每次尝试失败时最多计数 3 次。

而不是 运行ning while k == True,您想要同时检查 k == Trueattempts <= 3。就等待五分钟而言,您需要创建用户上次猜测时间的时间戳。

from datetime import datetime

...
k = True
password_attempts = 0

while k and password_attempts < 4:
    try:
        display.lcd_clear()
        display.lcd_display_string("ENTER PASWORD", 1)
        display.lcd_display_string("----------------", 2)
    except Exception:
        print("SCREEN ERROR")
    pasword = input("")
    display.lcd_clear()
    try:
        display.lcd_clear()
        display.lcd_display_string("YOU TYPED:", 1)
        display.lcd_display_string(pasword, 2)
        time.sleep(2)
        display.lcd_display_string("CONFIRM? Y/N", 1)
    except Exception:
        print("SCREEN ERROR")
    ok = input("")
    if ok == "y":
        k = False
    else:
        display.lcd_clear()
        password_attempts += 1
        if password_attempts == 4:
            #Create a timestamp of last attempt
            last_request = datetime.now()
            current_request = datetime.now()
            while((last_request - current_request).total_seconds() < 5 * 60):
                #Code to play music
                current_request = datetime.now()

然后由您决定 re-route 玩家回到程序中再次尝试输入密码的位置。

但是,您在这个项目开始时所做的设计选择将真正开始妨碍您想要做的事情。

我建议您考虑重新设计您的程序,以便更轻松、更愉快地工作。

编程中最好的部分之一是代码re-use;这是最容易理解的功能。在 Python 中,您使用语法 def function_name():

创建一个函数

然后,当您想要 运行 该函数中的代码时,您只需按名称调用它:function_name().

这对您的应用意味着什么?

你可以用一个方法包装对 LCD 的写入,这样你就可以避免重复输入相同的 try:... except: 块(顺便说一下......当你写 except Exception 时,你是捕获您的程序可能抛出的所有异常。这被认为是不好的做法,因为您可能不想做同样的事情,而不管异常首先是什么。相反,尝试找到您试图捕获的特定异常,并具体地按名字抓住那个)。

改写LCD打印示例:

def print_to_lcd(statements_to_print: [str]):
    line_number = 1
    try:
        for statement in statements_to_print:
            display.lcd_display_string(statement, line_number)
            line_number += 1
    except Exception:
        print("SCREEN ERROR")

然后,您只需生成一个要让 LCD 打印的列表,然后用它们调用 LCD 函数:

things_to_write = ["PASSWORD...", "UNACCEPTED"]
print_to_lcd(things_to_write)

对于您如何检查密码值、何时播放音乐等也可以这样说。

每当您发现自己重复 re-writing 相同的信息时,花点时间想一想是否有一种方法可以让您只写一次,然后 re-use 就可以了。它将使您的程序更易于编写和使用。

特别是在这种情况下,因为您想 re-do 在等待一段时间后做同样的事情。想象一下,当用户第四次输入错误的密码时,不必写成吨的 if-statements,您只需要写这样的东西:

play_music_for_five_minutes()
prompt_for_password()

如果还有其他问题我可以回答,请告诉我!