wie zum teufel wartet man auf einen Tastendruck?

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
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Ohje, meine Fragen werden immer simpler: Also in den docs lese ich das hier:
getch ()
Read a keypress and return the resulting character. Nothing is echoed to the console. This call will block if a keypress is not already available, but will not wait for Enter to be pressed. If the pressed key was a special function key, this will return '\000' or '\xe0'; the next call will return the keycode. The Control-C keypress cannot be read with this function.

ich dachte dass das bedeutet dass getch() wartet (='block'), bis eine Taste gedrückt wird? Also dass das folgende:

Code: Alles auswählen

import msvcrt

ch = msvcrt.getch()
print ch
...eben auf einen Tastendruck wartet? Tut es aber nicht, und ich hab's auch bisher nicht hinbekommen.

Das hier:

Code: Alles auswählen

import msvcrt

ch = ""
while ch != "x":
    ch = msvcrt.getch()
    print ch
da hätte ich gedacht dass es jeden Tastendruck printed, aber stattdessen printed es endlos ein y mit punkten...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jo_hb hat geschrieben:

Code: Alles auswählen

import msvcrt

ch = ""
while ch != "x":
    ch = msvcrt.getch()
    print ch
da hätte ich gedacht dass es jeden Tastendruck printed, aber stattdessen printed es endlos ein y mit punkten...
Hallo jo_hb!

Das tut es auch. >> nur nicht im IDLE <<
Nimm einfach die Konsole oder eine andere IDE zum Testen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

aha, IDLE ist Schuld! Also ich hatte ja schonmal Scite probiert, bin dann aber wieder zu IDLE zurück wegen dem Stack viewer - gibt's den ne andere IDE, die sowas auch hat? Oder vielleicht kann man Scite so konfigurieren dass es den Stackviewer einbindet, bloss wie?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

jo_hb hat geschrieben:gibt's den ne andere IDE, die sowas auch hat?
Hallo jo_hb!

``msvcrt.getch()`` ist ein spezieller Befehl für die Konsole. Ich glaube nicht, dass du viele IDEs finden wirst, die das abfangen können. Solche Programme testet man dann eben nur über die Konsole.

Was den Rest betrifft, bin ich eingeschworener WingIDE-Fan. Diese IDE hat auch einen "Callstack"-Viewer mit an Bord.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

msvcrt.getch() ist ein Befehl für cmd.com?
BlackJack

Nein, das ist eine Funktion für Python. Sie sollte auf der `stdin`-Datei operieren.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

BlackJack hat geschrieben:Nein, das ist eine Funktion für Python. Sie sollte auf der `stdin`-Datei operieren.
Aber dieser Befehl läuft nur auf Windows Rechnern und auch nur in der Windows Konsole.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

blackbird hat geschrieben:läuft nur auf Windows Rechnern und auch nur in der Windows Konsole.
...und greift direkt auf den Konsolen-Buffer zu.

http://docs.python.org/lib/msvcrt-console.html

Und im Idle funktioniert aus diesem Grund auch ``getpass.getpass()`` nicht.

Code: Alles auswählen

>>> import getpass
>>> getpass.getpass()
Warning: Problem with getpass. Passwords may be echoed.
Password: Hallo
'Hallo'
>>>
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

gerold hat geschrieben:Und im Idle funktioniert aus diesem Grund auch ``getpass.getpass()`` nicht.

Code: Alles auswählen

>>> import getpass
>>> getpass.getpass()
Warning: Problem with getpass. Passwords may be echoed.
Password: Hallo
'Hallo'
>>>
lol
Geniales Feature, wenn man dazu tendiert, seine Passwörter zu vergessen. Einfach von Windoof speichern und dann jedes mal ausgeben lassen. It's not a Bug, ...

Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Michael Schneider hat geschrieben:Geniales Feature, wenn man dazu tendiert, seine Passwörter zu vergessen. Einfach von Windoof speichern und dann jedes mal ausgeben lassen. It's not a Bug, ...
Du vergisst aber schnell...
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

blackbird hat geschrieben:
Michael Schneider hat geschrieben:Geniales Feature, wenn man dazu tendiert, seine Passwörter zu vergessen. Einfach von Windoof speichern und dann jedes mal ausgeben lassen. It's not a Bug, ...
Du vergisst aber schnell...
Kannst Du das bitte etwas ausführlicher formulieren? Ich wollte diese bekannte Redensart nur andeuten und damit den Bogen zum Beginn meines Postings schlagen - ...it's a feature. :-)

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Michael Schneider hat geschrieben:Kannst Du das bitte etwas ausführlicher formulieren? Ich wollte diese bekannte Redensart nur andeuten und damit den Bogen zum Beginn meines Postings schlagen - ...it's a feature. :-)
Zwischen Zeichen eingeben und anzeigen vergehen keine zwei Millisekunden. Das wollte ich damit sagen.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Michael Schneider hat geschrieben:Geniales Feature, wenn man dazu tendiert, seine Passwörter zu vergessen.
Hallo Michel!

Ich möchte das hiermit aufklären: Mit ``getpass.getpass()`` kann man den Benutzer zur Eingabe eines Passworts veranlassen. Wird das Programm in der Konsole ausgeführt, dann wird das Passwort, das der Benutzer eingibt, nicht auf dem Bildschirm angezeigt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hallo,

vielen dank, aber ich habe das schon verstanden und ich hoffe, die anderen auch.

Ich bin nur etwas abgeschwiffen und habe für die Ironie, dass genau das, was geheim bleiben sollte, angezeigt wird (auch wenn in diesem Spezialfall nur im IDLE), laut über eine übertragene, praktische Anwendung nachgedacht. Mir ist auch bewusst, dass der Windows-Eingabedialog, bei dem man sein Login und Kennwort speichern kann (man kann da sein Kennwort einmal eingeben und vergisst es dann schonmal, wenn man es nicht regelmäßig braucht), NICHT im IDLE ausgeführt wird. Es ging mir um den Effekt und nicht darum, es speziell mit dieser Funktion umzusetzen!

Tut mir leid, wenn diese komisch gemeinte Anmerkung falsch rüberkam.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Was ist denn mit

Code: Alles auswählen

wait = raw_input("Taste drücken")
Das sollte zumindest plattformübergreifend gehen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

mkallas hat geschrieben:

Code: Alles auswählen

wait = raw_input("Taste drücken")
Hallo mkallas!

Das reagiert nur auf ENTER und nicht auf jeden Tastendruck.

mfg
Gerold
:-)

PS: mkallas, dein großer Banner im Fuß braucht immer ziemlich lange, bis er geladen ist. Außerdem stört er irgendwie. Wäre super, wenn du dich auf den kleinen Banner beschränken könntest. Das ist keine Aufforderung, sondern nur eine Bitte. :-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Hallo Gerold,
Hab mir jetzt mal WingIDE installiert, aber wie es aussieht kann das mit msvcrt.getch() auch nicht umgehen, oder doch?
('oder doch?', weil da immerhin steht "Debug I/O (stdin, stdout, stderr) appears below.", und ich nicht sicher bin ob das getch() nicht mit stdin zu tun hat??)

Oder ist es ansonsten vielleicht möglich aus WingIDE direkt eine Konsole zu starten, in der das programm dann läuft?

EDIT: OK die letzte Frage hat sich erledigt: 'execute current file'... :)

Gruss,
Jo
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

gerold hat geschrieben:
mkallas hat geschrieben:

Code: Alles auswählen

wait = raw_input("Taste drücken")
Hallo mkallas!

Das reagiert nur auf ENTER und nicht auf jeden Tastendruck.
Stimmt, ich habe die Fragestellung nicht genau genug gelesen...
Antworten