2016-03-26 5 views
0

Ich muss ein Funktionsmenü definieren, damit der Benutzer eine Zahl basierend auf den Auswahlmöglichkeiten eingeben kann. Hier ist, was ich bisher:Python: Menü kann nicht beendet werden - Benutzereingabe

def menu(preamble, choices) : 
    choose_one = " Choose one of the following and enter its number:" 
    print(preamble + choose_one) 

    for number in range(len(choices)): 
     all = "%g: %s" % (number + 1, choices[number]) 
     print(all) 

    prompt = ("\n") 
    warning = "\n"  
    while warning: 
     choose = int(input(warning + prompt)) 
     warning = '' 
     if choose not in range(1,len(choices)): 
      warning = "Invalid response '%s': try again" % choose 
      for number in range(len(choices)): 
       all = "%g: %s" % (number + 1, choices[number]) 
       print(all)    
     else: 
      break 
    return choose 

Sagen wir zum Beispiel, dass die Wahl zwischen:

1. I have brown hair 
2. I have red hair 
3. Quit 

Ich habe versucht, den Code ausgeführt wird und es funktioniert gut, wenn == 1 wählen, und wählen Sie == 2. Wenn Sie jedoch == 3 wählen, wird der Benutzer aufgefordert, erneut auszuwählen. Was muss ich tun, damit die Option "Quit" funktioniert?

+0

Ihre Nummer für die Beendigungsoption liegt außerhalb des zulässigen Bereichs. Dein Code wird also darum bitten, erneut zu wählen. Fügen Sie entweder einen Test für Ihren Bereich + 1 (die Option "Beenden") hinzu, und fügen Sie den Bereich + 1 in Ihre Menüoptionen ein. –

Antwort

1

Sie benötigen 1 hinzuzufügen:

len(choices) + 1 

Bereiche sind halb offen so die obere Grenze ist nicht enthalten, so ist 3 im Bereich nicht, wenn die Länge 3.

In [12]: l = [1,2,3] 

In [13]: list(range(1, len(l))) 
Out[13]: [1, 2] 

In [14]: list(range(1, len(l) + 1)) 
Out[14]: [1, 2, 3] 

Ich würde auch Ihre Logik ein wenig ändern:

Sie könnten auch Verwenden Sie ein Diktat, um die Auswahl und die Nummer zu speichern:

from collections import OrderedDict 
choices = OrderedDict(zip(range(1, len(choices)+ 1),choices)) 
for k,v in choices.items(): 
     msg = "%g: %s" % (k, v) 
     print(msg) 

while True: 
    choose = int(input(warning + prompt)) 
    if choose in choices: 
     return choose 
    print("Invalid response '%s': try again" % choose) 
    for k,v in choices.items(): 
     msg = "%g: %s" % (k, v) 
     print(msg) 
+0

Wow, ich kann nicht glauben, dass ich das nicht bemerkt habe. Die kleinen Details vermasseln mich immer. Danke – tupitupa

+0

Keine Sorge, du bist nicht der Erste und wirst nicht der Letzte sein, es ist ein leichter Fehler zu machen. –

Verwandte Themen