Seite 1 von 1

Konsolen Menüs

Verfasst: Montag 1. September 2008, 21:18
von Imperator
Hallo allerseits,

ich melde mich auch mal wieder zurück. Mit einer kleinen aber meiner Meinung nach doch recht nützlichen Funktion zur darstellung von Menüs in der Konsole. Wenn man das da oft braucht erspart es wirklich ne Menge Schreibarbeit.

Code: Alles auswählen

def waehlen(moeglichkeiten):
        moeglichkeiten = moeglichkeiten.split(', ')
        nummer = 0
        for i in range(len(moeglichkeiten)):
            moeglichkeiten[nummer] = str(nummer) + moeglichkeiten[nummer] + ' '
        nummer = nummer + 1
        element = 0
        moeglichkeiten_2 = ''
        for i in range(len(moeglichkeiten)):
            moeglichkeiten_2 = moeglichkeiten_2 + moeglichkeiten[element]
            element = element + 1
        eingabe = raw_input('Bitte waehlen sie zwischen ' + moeglichkeiten_2 + ' ')
        return eingabe
Urteilt selbst :D

Verfasst: Montag 1. September 2008, 21:54
von EyDu
Ist jetzt ungetestet, aber das hier sollte in etwa das selbe liefern:

Code: Alles auswählen

def waehlen(moegl): 
    m = " ".join("%d%s" % x for x in enumerate(moegl.split(', ')))
    return raw_input("Bitte waehlen Siezwischen %s " % m)
Da ich es aber etwas unsinnig finde, die Menüeinträge als durch Kommas getrennte Strings zu übergeben, ist eine Liste/ein Tupel ... die schönere Lösung:

Code: Alles auswählen

def waehlen(moegl): 
    m = " ".join("%d%s" % x for x in enumerate(moegl))
    return raw_input("Bitte waehlen Sie zwischen %s " % m)
Aber was bringt mir ein Auswahlmenü, bei dem die Auswahl nicht sofort überprüft wird? Dann muss man einen Großteil der Logik immer wieder erneut implementieren.

Bei dem range(len(...)) mit einem zusätzlichen eigenen Zähler war mein Gesichtsausdruck in etwa eine Mischung aus :shock: und :lol:. ^^

Verfasst: Dienstag 2. September 2008, 10:40
von Imperator
EyDu hat geschrieben:
Aber was bringt mir ein Auswahlmenü, bei dem die Auswahl nicht sofort überprüft wird? Dann muss man einen Großteil der Logik immer wieder erneut implementieren.

^^
das bringt dir, dass du nur noch schreiben musst:

Code: Alles auswählen

auswahl = waehlen()
if auswahl == 1:
 ...

Verfasst: Dienstag 2. September 2008, 11:01
von BlackJack
@Imperator: Eben nicht! Du musst jedes mal wenn Du die Funktion verwendest, ausserhalb der Funktion überprüfen ob die `auswahl` überhaupt gültig ist. Etwas was man eigentlich *in* der Auswahlfunktion erledigen sollte, inklusive Wiederholung der Abfrage, wenn der Benutzer etwas Falsches eingegeben hat.

Verfasst: Donnerstag 16. Oktober 2008, 10:02
von roschi
hallo!

wie findet ihr das hier?
http://paste.pocoo.org/show/88186/

beispiel:

Code: Alles auswählen

import ConsoleMenu

def do_anything(choice):
    print "%d choosed" % choice

ConsoleMenu.menu(("Funktion1", "Funktion2"),
                 prompt="Please choose: ",
                 headline="MainMenu:",
                 callback={1:do_anything})
mfg
roschi

Verfasst: Donnerstag 16. Oktober 2008, 10:30
von numerix
roschi hat geschrieben:wie findet ihr das hier?
http://paste.pocoo.org/show/88186/
Zeile 36 ist zu umständlich! Statt:

Code: Alles auswählen

if not choice in xrange(1, len(entries) + 1):
genügt:

Code: Alles auswählen

if not 0<choice<=len(entries):

Verfasst: Donnerstag 16. Oktober 2008, 15:24
von BlackJack
Ich finde das `callback`-Dictionary keine so gute Idee. Menüpunkte und Rückruffunktion gehören zusammen. So wird's immer "lustig" wenn man einen Haufen Menüpunkte mit Rückruffunktionen hat und einen einfügen oder entfernen möchte. Dann geht das fröhliche Umnummerieren los.

Verfasst: Freitag 17. Oktober 2008, 13:13
von roschi
vielen dank!

das ist bestimmt besser:
http://paste.pocoo.org/show/88780/

lg
roschi

[edit]
noch was gefixt
[/edit]

Verfasst: Freitag 17. Oktober 2008, 14:29
von Hyperion
Wobei es in Deinem Beispiel für den Nutzer verwirrend sein dürfte, wieso er Item 0 als gewählt präsentiert, wo er doch die 1 eingegeben hat ;-)

Erinnert mich an die tollen Bahn-Automaten, bei denen man an einer Stelle eine 0 eingeben mußte, wenn man keine Bahncard hatte o.ä. (anno 2005) Fand ich als Informatiker ja irgend wie lustig ... aber für jemand unbedarfteren ist das schon mal ne Hürde! "Ssank you for travvelling wiss Deutsche Bahn!" kann ich da nur sagen :-D

Verfasst: Freitag 17. Oktober 2008, 16:06
von roschi
hallo!

danke fuer das feedback!

ich habe das so gemacht, damit die auswahl mit der stelle uebereinstimmt, an der die menueeintraege in der liste stehen. wer es anders haben moechte, kann das ja einfach umaendern. es sind ja nur ein paar mal ' - 1', die er wegmachen muss. :)
Hyperion hat geschrieben:Erinnert mich an die tollen Bahn-Automaten, bei denen man an einer Stelle eine 0 eingeben mußte, wenn man keine Bahncard hatte o.ä. (anno 2005) Fand ich als Informatiker ja irgend wie lustig ... aber für jemand unbedarfteren ist das schon mal ne Hürde! "Ssank you for travvelling wiss Deutsche Bahn!" kann ich da nur sagen
:lol:

lg
roschi