Seite 1 von 2

input automatisch bestaetigen

Verfasst: Freitag 31. März 2006, 13:48
von lemmi
ist is moeglich, dass bei einem input-befehl, nach der eingabe des 2. zeichens kein enter mehr benoetigt wird?
also dass ich nur eingeben muss z.B.:
54263635 und er mir das dann zerlegt in 54 26 36 35, mich aber jede 2 zeichen erneut fragt.

Verfasst: Freitag 31. März 2006, 19:13
von Leonidas
Ich glaube (allerdings verstehe ich dein Problem nicht exakt) dass dir da msvcrt.getche() helfen kann.

Verfasst: Freitag 31. März 2006, 21:03
von lemmi
also man soll zu eingabe aufgefordert werden, jedoch ist diese soll diese nach dem 2ten zeichen selbst `enter` druecken.
klingt etwas bloed, zugegeben, ich kanns aber nicht besser formulieren.

bsp:
  • naechste zahl (warte): 56 OK
    naechste zahl (warte): 98 OK
    naechste zahl (warte): 75 OK
    naechste zahl (warte): 05 OK
    naechste zahl (warte): 12 OK
    naechste zahl (warte): 6
alles was ich in die konsole eingeben moechte ist 56987505126 ohne jegliches enter und leerzeichen

Verfasst: Freitag 31. März 2006, 22:29
von modelnine
Probier mal (zumindest unter Unix, wo's msvcrt.getch() nicht gibt):

Code: Alles auswählen

import sys
import termios
import tty

old = termios.tcgetattr(sys.stdin.fileno())
tty.setraw(sys.stdin.fileno())

zahlen = []
while True:
  sys.stdout.write("Bitte zwei Ziffern eingeben: ")
  try:
    zahlen.append(int(sys.stdin.read(2)))
  except ValueError:
    break
  sys.stdout.write("%s OK\r\n" % zahlen[-1])

termios.tcsetattr(sys.stdin.fileno(),termios.TCSADRAIN,old)
sys.stdout.write(" Abgebrochen...\r\n")

print "Eingegeben:", zahlen
Das ganze funktioniert nur mit ungepuffertem stdin (deswegen die ganze tty und termios-Magie, die aber wie der Name schon sagt nur auf ein tty funktioniert, nicht auf eine Pipe oder ähnliches).

Verfasst: Freitag 31. März 2006, 23:26
von Leonidas
Das fand ich recht witzig, deswegen noch eine Version mit msvcrt:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-
import sys, msvcrt

def two_input():
    print 'Press Enter to quit'
    inputs = []
    while True:
        sys.stdout.write('Insert number: ')
        ch1 = msvcrt.getch()
        if ch1 == '\r':
            sys.stdout.write('\n')
            return inputs
        sys.stdout.write(ch1)
        ch2 = msvcrt.getch()
        sys.stdout.write(ch2)
        
        inputs.append(ch1)
        inputs.append(ch2)
        sys.stdout.write('\n')

def main():
    stuff = ''.join(two_input())
    print 'Wrote ', stuff

if __name__ == '__main__':
    main()
Ich denke, dass man es auch hätte schöner machen können, aber das demonstriert zumindest das Prinzip.

Verfasst: Samstag 1. April 2006, 17:56
von lemmi
ich bedanke mich mal.
ich werde das dann morgen mal ausprobieren!

Verfasst: Sonntag 16. April 2006, 00:27
von lemmi
sorry, dass ich das nochmal ausgrabe, aber bin jetzt erst dazu gekommen.
das 2. beispiel geht nicht. es gipt die ganze zeit nur aus, und es laesst sich auch nicht mehr abbrechen.
das 1. weiß ich nicht, konnte es noch nicht unter geeigneten bedingung testen.


mal dazu, fuer was ich das brauche.
ich hab hier zuhause nen 20 seiten wuerfel herumfliegen und wollte mal so schauen wie oft welche zahl vorkommt usw.
es ist durch das script natuerlich schon einfacher ne statistik aufzustellen, dennoch verbesserungsfaehig. ein ansatz waere dazu halt gewesen das enter nicht mehr druecken zu muessen.
der script sieht chaotisch aus, ich weiß, bin halt noch am anfang.

Code: Alles auswählen

# ------------------------------------------------------------------------------
def input_e():

    liste = []
    zaehler = 0
    
    while True:
        x = raw_input('naechste zahl: ')    #Eingabe

        try:
            x = int(x)  #Value Error, falls keine Eingabe
            if x > 20:  #Pruefe, ob X erlaubt ist, wenn nicht, neuer Versuch
                print 'zahl groesser 20!'
                continue
        
        except ValueError: 

            if x == 'fertig':   #Falls "fertig" eingegebn ist, Schleife beenden
                break

            if x == '': #Falls keine Eingabe: moeglichkeit neuer Versuch oder 
                frage = raw_input('fertig? (J/N): ')    #Schleife zu beenden
                if frage == 'N':
                    continue
                else:
                    break
                       
        else:   #Falls es keine Ausnahmen gab:
            liste.append(x) #Fuege X zur liste hinzu
            zaehler = zaehler + 1 
            print 'OK'

    return zaehler, liste

#-------------------------------------------------------------------------------
#main:

zaehler, liste = input_e()
print ''
durchschnitt = 0        

for nummer in range(0, zaehler):    
    print 'nummer %2d: %2d' % (nummer, liste[nummer]) #Gebe die Haeufigkeit
    durchschnitt = durchschnitt + liste[nummer] #jeder Zahl aus und bilde die
                                                #Summe aller Zahlen der Liste
print ''
durchschnitt = float(durchschnitt) / float(zaehler) #Errechne Durchschnitt

for nummer in range(1, 21): #Statistik fuer jede zahl
    print 'nummer %2d: %2d   abweichung:  %2d sollte %2.3f mal vorkommen. %2.5f%%' % (nummer, liste.count(nummer), nummer, float(zaehler) / 20, float(liste.count(nummer)) * 100 / float(zaehler))

print "Durchschnitt:", durchschnitt

Verfasst: Sonntag 16. April 2006, 09:13
von modelnine
Kennst Du Dich ein bisschen mit Statistik aus? Ich denke mal dass es darum ging zu testen ob der Würfel gezinkt ist oder nicht, dafür reichts aber nicht einfach nur die Differenzen zu den Erwartungswerten zu berechnen, sondern man muß mittels eines Konfidenzintervalles und zum Beispiel des Chi²-Tests rausfinden inwiefern die Hypothese dass der Würfel in Ordnung ist abzulehnen ist.

Ich kann mal schauen ob ich das irgendwo noch mal ausgraben kann; ich hab zumindest ein Buch darüber. ;-)

Verfasst: Montag 17. April 2006, 20:08
von Leonidas
lemmi hat geschrieben:das 2. beispiel geht nicht. es gipt die ganze zeit nur aus, und es laesst sich auch nicht mehr abbrechen.
Doch, wenn dich Enter drücke beendet es sich ganz brav.

Verfasst: Dienstag 18. April 2006, 15:33
von murph
Schließe ich richtig daraus, dass ich, wenn ich plattformunabhängig sein will,
zuerst das Betriebssystem abfragen muss und danach dann entweder den einen oder den anderen Skript ausführen muss? Wäre sehr umständlich für eine kleine Hilfestellung!

Verfasst: Dienstag 18. April 2006, 15:40
von Leonidas
murph hat geschrieben:Schließe ich richtig daraus, dass ich, wenn ich plattformunabhängig sein will, zuerst das Betriebssystem abfragen muss und danach dann entweder den einen oder den anderen Skript ausführen muss?
Ja.
Beschwer dich bei Microsoft, warum die nicht POSIX-Kompatibel sind oder bei den Entwicklern deiner libc warum sie die Funktionen der C-Runtime von Microsoft nicht bereitstellt.

Vielleicht kannst du es unter Linux auch mit curses versuchen, aber ich habe keine Lust das nun auszuprobieren, weil curses mich deprimiert :x

Verfasst: Dienstag 18. April 2006, 15:41
von icepacker
Wie kommst du darauf?
Meinst du wegen den Posts von modelnine&Leonidas?

Beide haben Module importiert die nunmal plattformabhängig sind.
Ein "normales" Pythonscript läuft aber, einmal gecodet, überall da wo ein
Python Interpeter installiert ist.

Verfasst: Dienstag 18. April 2006, 15:43
von murph
Wieso deprimiert dich curses?

Verfasst: Dienstag 18. April 2006, 15:44
von modelnine
Ein "normales" Pythonscript läuft aber, einmal gecodet, überall da wo ein
Python Interpeter installiert ist.
Hui. Eine gewagte These. Ich habe ein ganz normales Python-Skript geschrieben, genauso wie Leonidas, mit dem Unterschied, dass wir Funktionalität benutzen, die zwar von der Python-Stdlib gewrappt ist, aber nur unter einem bestimmten Systemtyp. In der Dokumentation ist genau dokumentiert wo/was/wie gebraucht/angeboten wird, dementsprechend muß man einfach da nachgucken, und eben "um die Inkompatibilitäten" rumprogrammieren. Das ist aber im Normalfall kein Problem.

Verfasst: Dienstag 18. April 2006, 15:48
von mr.hide
Bastel doch einfach ein GUI. Das kriegt man Plattformunabhängig hin.

Und ist auch nicht so aufwendig...

Verfasst: Dienstag 18. April 2006, 15:53
von Leonidas
murph hat geschrieben:Wieso deprimiert dich curses?
Weil es grausig unpythonisch ist, weil es mein Terminal immer wenn es einen Fehler gibt zerschießt, weil nichts so funktioniert, wie man das gerne hätte, weil es umständlich ist, weil es sowieso nur unter Unices funktioniert...
Ist natürlich nur meine Meinung, YMMV.

Verfasst: Dienstag 18. April 2006, 15:55
von murph
Ich hielt es für erwiesen, dass die eine Methode Windows-, die andere Methode Linuxangepasst war. Durch diesen speziellen Zusammenhang dachte ich, dass es sehr wohl nicht zueinander kompatibel ist.
Oder benutzt Windows etwa tty?

Ich weiß, dass Python (eigentlich) Plattformunabhägig ist, deshalb habe ich ja auch diese Sprache als Zweitsprache gewählt (erste ist PHP)

Verfasst: Dienstag 18. April 2006, 16:07
von gerold
Hi murph!

Dort findest du eine Liste der eingebauten Python-Module:
http://www.python.org/doc/2.4.3/modindex.html

Falls ein Modul nur auf einem bestimmtes Betriebssystem funktioniert, steht das dabei. Das sind meistens spezielle Sachen, die es nur bei diesem Betriebssystem gibt.

Das Modul _winreg ist nur für Windows, weil nur Windows eine Registry hat. Das Modul NIS gibt es nur für UNIX/Linux weil das ein typisches Produkt für unixoide Systeme ist. Windows kann normalerweise mit so etwas nichts anfangen. Alles klar?

mfg
Gerold
:-)

Verfasst: Dienstag 18. April 2006, 16:29
von murph
Ich habe das Gefühl, dass wir aneinander vorbeireden.
Ich will (nicht alleine) ein automatisches "enter" nach x Zeichen.
Dieses sollte plattformunabhängig sein. Scheint es aber nicht zu sein.
Sehe ich das richtig?

@ichweissnicht:
in dem Moduleindex wird curses als plattformunabhägig angegeben.

@forummaster: Kann man einstellen, dass man beim Editieren auch die vorigen Posts sehen kann?

Verfasst: Dienstag 18. April 2006, 16:55
von Leonidas
murph hat geschrieben:Ich will (nicht alleine) ein automatisches "enter" nach x Zeichen.
Dieses sollte plattformunabhängig sein. Scheint es aber nicht zu sein.
Sehe ich das richtig?
In etwa. Unter Linux gibt es den einen Weg, unter WIdnows den anderen. Aber du kannst beide Wege in einem Script verwenden und zur Luafzeit bestimmen, welchen Weg du gehst.
murph hat geschrieben:in dem Moduleindex wird curses als plattformunabhägig angegeben.
Curses Module Documentation hat geschrieben:While curses is most widely used in the Unix environment, versions are available for DOS, OS/2, and possibly other systems as well. This extension module is designed to match the API of ncurses, an open-source curses library hosted on Linux and the BSD variants of Unix.
Ergo: Linux und BSD.
murph hat geschrieben:@forummaster: Kann man einstellen, dass man beim Editieren auch die vorigen Posts sehen kann?
Beim Antworten auf Threads? Ja, ist sogar schon eingestellt, ich sehe die vorherigen Antworten auf diesen Thread.