【问题标题】:how to keep code block looping until user creates username/password in python?如何保持代码块循环,直到用户在 python 中创建用户名/密码?
【发布时间】:2017-02-22 18:18:44
【问题描述】:

我有这个代码:

while True:

uName = []
uPassword = []

maxLengthList = 1
maxPassList = 1

acceptEnt = ["YES", "yes", "Y", "y"]
denyEnt = ["NO", "no", "N", "y"]

while len(uName) < maxLengthList:
    item = raw_input("Create a username: ")
    uName.append(item)
    checkU = raw_input("Is %s correct? " % uName)
    if checkU in acceptEnt:
        while len(uPassword) < maxPassList:
            pw = raw_input("Create a password: ")
            uPassword.append(pw)
            checkP = raw_input("Is %s correct? " % uPassword)
            if checkP in acceptEnt:
                print "%s logging in..." % uName
    else:
        if checkU in denyEnt or checkP in denyEnt:
            print "Error"
break

应该让用户创建一个用户名和密码,然后传递给这个:

done = True

while done == True:
    sys.stdout.write('\rLoading')
    time.sleep(0.11)
    sys.stdout.write('\rLoading. ')
    time.sleep(1)
    sys.stdout.write('\rLoading.. ')
    time.sleep(2)
    sys.stdout.write('\rLoading... ')
    time.sleep(1)
    sys.stdout.write('\rLoading.... ')
    time.sleep(0.39)
    sys.stdout.write('\rLoading..... ')
    time.sleep(0.19)
    sys.stdout.write('\rLoading...... ')
    time.sleep(0.25)
    done = False
sys.stdout.write('\rInitializing')
time.sleep(3)
sys.stdout.write('\rHello, %s' % uName)
time.sleep(1.5)

仅模拟加载操作。在用户输入用户名和密码之前,我需要它不传递给该代码块,但即使用户在询问 %s 是否正确时输入“否”,它也会传递给下一个代码。

我试图让它坚持创建帐户,直到输入真正的输入,当输入“否”时,然后将用户返回到之前的创建屏幕。我根本不希望他们能够绕过那部分,这是他们可以做的。

更新:

我最终将其更改为布尔值,虽然我打算稍微清理一下代码,但对我来说似乎更快。

entry = 真

当条目 == 真时:

uName = []
uPassword = []

maxLengthList = 1
maxPassList = 1

acceptEnt = ["YES", "yes", "Y", "y"]
denyEnt = ["NO", "no", "N", "y"]

while len(uName) < maxLengthList:
    item = raw_input("Create a username: ")
    uName.append(item)
    checkU = raw_input("Is %s correct? " % uName)
    if checkU in acceptEnt:
        while len(uPassword) < maxPassList:
            pw = raw_input("Create a password: ")
            uPassword.append(pw)
            checkP = raw_input("Is %s correct? " % uPassword)
            if checkP in acceptEnt:
                print "%s logging in..." % uName
                entry = False
                break
            else:
                print "pw wrong test"
    else:
        print "uname wrong test"
    break

这似乎暂时有效,但我肯定会再次访问它,因为我会寻找此处提到的替代方案。

【问题讨论】:

标签: python python-2.7


【解决方案1】:

你能不能用一种完全不同的方式来实现,比如使用事件处理程序? 代码执行完成,向用户显示文本框,当文本框被填写并按下按钮时,执行恢复并且您的代码继续 一个好的事件系统是http://pydispatcher.sourceforge.net/

这将允许您等待事件,并在事件发生时以编程方式处理该事件

【讨论】:

  • 我会对此进行研究,尽管该程序主要是基于文本的。这是创建虚拟PC环境的核心代码。我已经走了很长一段路,但我仍在学习。这是我的宠物项目。
【解决方案2】:

你可以用函数和递归来做到这一点,我觉得下面的内容很干净(尽管它可能会更短)。

代码:

import time
import sys

def pause_clear(message='Loading',delays=None):
    delays = delays if delays else [0.11,1,2,1,0.39,0.19,0.25]
    for ind,delay in enumerate(delays):
        sys.stdout.write(message+'.'*(ind+1)+'\r')
        time.sleep(delay)
        sys.stdout.flush()
    sys.stdout.write('\n')

def ask_ok():
    response = raw_input('Is this correct? ')

    acceptEnt = ['YES','yes','Y','y']
    denyEnt = ['NO','no','N','n']
    if response in acceptEnt:
        return True
    elif response in denyEnt:
        return False
    else:
        pause_clear('only yes or no answers please',[0.1,2])
        return ask_ok()

def prompt(question):
    answer = raw_input(question+' ')
    if ask_ok():
        return answer
    else:
        pause_clear('ok then please try again',[0.1,2])
        return prompt(question)


uName = prompt('What is your username? ')
pause_clear()
uPassword = prompt('What is your password? ')
pause_clear()
sys.stdout.write('Done, your username is ['+uName+'] and password is ['+uPassword+']\n')

【讨论】:

  • 看起来确实不错。检查我在原始帖子中的编辑,我最终只是添加了一个布尔值,它暂时有效。稍后当我重新访问它以更改它时,我将使用它作为参考。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多