eingabe mit startwert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
samyboy
User
Beiträge: 9
Registriert: Sonntag 19. August 2007, 18:59

Sonntag 19. August 2007, 22:40

ich stehe vor folgendem problem:
ich bräuchte auf der kommandozeile eine eingabeaufforderung, wo aber ein startwert auch mitgegeben werden kann
z.B: Bitte geben sie ihren Namen ein: ihr Name
der User sollte dann denn Startwert löschen können und statt dessn einen anderen eingeben können
ich kenne nur die Funktion raw_input(prompt) aber ich bräuchte eben noch etwas wo man startwert auch mitgebn kann
hat da einer ne idee wie man das machen kann?
mfg samy
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Sonntag 19. August 2007, 23:27

So spontan würd' mir nur ein Workaround einfallen:

Code: Alles auswählen

name = raw_input("Bitte geben sie ihren Namen ein [Default = Foobar]: ")
if not name:
    name = "Foobar"
print name
So is's auch gemütlicher, anstatt zu löschen... für mich zumindest.
lunar

Montag 20. August 2007, 11:38

Sofern dein System readline zur Verfügung stellt, kannst du mit input hooks arbeiten:

Code: Alles auswählen

import readline

def input_hook():
    readline.insert_text('Zaphod')
    readline.redisplay()

readline.set_pre_input_hook(input_hook)
name = raw_input('Your name please: ')
# remove hook 
readline.set_pre_input_hook(None)
print 'Your name is', name
Funktioniert aber nur auf Systemen, die readline mitbringen. Das wären eigentlich alle Unixe (iirc auch Mac OS X), aber das berühmt-berüchtigte Windows bleibt außen vor, sofern du nicht externe Bibliotheken wie pyreadline mitlieferst.

Ansonsten bleibt dir unter Windows nur der vorgeschlagene Workaround, der zumindest dann sehr problematisch ist, wenn der Nutzer auch leere Werte eingeben können soll (was ich dann im Endeffekt so gelöst habe, dass der Nutzer ohne readline jeden Wert erneut eingeben muss).
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Montag 20. August 2007, 12:52

Außerdem steht readline unter der GPL, d. h. dein Programm musst dann ebenfalls GPL lizensiert sein! Nicht, dass ich damit ein Problem hätte, aber es ist wichtig, das im Hinterkopf zu behalten.
lunar

Montag 20. August 2007, 13:15

Joghurt hat geschrieben:Außerdem steht readline unter der GPL, d. h. dein Programm musst dann ebenfalls GPL lizensiert sein! Nicht, dass ich damit ein Problem hätte, aber es ist wichtig, das im Hinterkopf zu behalten.
Nein, readline steht nicht unter der GPL, das gilt nur für die GNU Implementierung. Es gibt andere Implementierungen für andere Systeme, die unter anderen Lizenzen stehen (das erwähnte pyreadline für Windows z.B. unterliegt der BSD Lizenz). Schon allein deswegen sehe ich kein Grund darin, mein Programm unter GPL zu stellen, den durch den darüber liegenden Wrapper kann ich mir ja noch nicht mal sicher sein, ob ich wirklich GNU readline in Python verwende.

Nebenbei stehen viele Bindings für andere Sprachen ebenfalls nicht unter der GPL, wie z.B. das Java-Binding (LGPL) und das TCL Binding (BSD).

Und es gibt nicht zuletzt Programme, die zwar readline verwenden, aber ebenfalls nicht unter der GPL stehen (z.B. ncurses, welches der MIT unterliegt).

Außerdem gilt doch für das readline Modul in Python keine Extra-Lizenz (zumindest ist das nirgendwo erwähnt), sondern nur die normale Python-Lizenz.
samyboy
User
Beiträge: 9
Registriert: Sonntag 19. August 2007, 18:59

Montag 20. August 2007, 21:11

Danke leute werd das gleich mal ausprobiern
;)
samyboy
User
Beiträge: 9
Registriert: Sonntag 19. August 2007, 18:59

Dienstag 21. August 2007, 13:28

hab jetz nen tipp bekommen ich soll getopt verwenden hat wer ne ahnung wie das funktioniert ?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 21. August 2007, 14:02

samyboy hat geschrieben:hab jetz nen tipp bekommen ich soll getopt verwenden hat wer ne ahnung wie das funktioniert ?
getopt ist doch für etwas ganz anderes gut (und außerdem wurde es von optparse unnötig gemacht).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
lunar

Dienstag 21. August 2007, 14:05

samyboy hat geschrieben:hab jetz nen tipp bekommen ich soll getopt verwenden hat wer ne ahnung wie das funktioniert ?
Auf den, der dir das erzählt hat, solltest du nicht mehr hören. getopt hat überhaupt gar nichts mit der Eingabe von der Konsole zu tun, sondern ist für das Parsen von Kommandozeilenargumenten zuständig. Und auch dafür sollte man es nicht mehr einsetzen, optparse ist state of the art für das Kommandozeilen-Parsing. Wie das geht, steht in der Doku...
samyboy
User
Beiträge: 9
Registriert: Sonntag 19. August 2007, 18:59

Dienstag 21. August 2007, 20:34

danke ;)
hab mir jetz schon meine eigene eingabe zusammengebaut so funktionierts:

Code: Alles auswählen

import msvcrt
import time
def cut(s): #schneidet das letzte zeichen des strings s ab
    i = len(s)
    s = s[0:i-1]
    return s
prompt = 'bitte geben sie ihren namen ein: '
startval = 'name'

print prompt
print startval,
inKey = 0
while inKey != 13: #enter
    key = msvcrt.getch()
    inKey = ord(key)
    if inKey == 8: #del
        startval = cut(startval)
    else:
        startval = startval + key
    print '\r',
    print startval,
print '\n'
print startval
time.sleep(20)
samyboy
User
Beiträge: 9
Registriert: Sonntag 19. August 2007, 18:59

Dienstag 21. August 2007, 22:29

eins wäre noch hilfreich da ich mit den pfeiltasten navigieren möchte muss ich irgendwie den cursor in der kommandozeile nach rechts oder links schieben können weiss wer zufällig wie das geht???
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 22. August 2007, 08:34

Vielleicht solltest du überlegen WConio zu verwenden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten