2016-03-30 13 views
0

Hauptfrage, für die Art, wie mein Python-Programm gebaut wird, versuche ich eine Schreibmaschine für mein Programm zu bauen, die beim Drücken einer Taste wie eine GUI aktualisiert. Ich stoße jedoch auf ein seltsames Problem mit ASCII, insbesondere Backspace.Python 3.4: getch() - Eine Schreibmaschine - Python

from msvcrt import getch 
import os 
#Test 
# Always run in Python CMD 
myinput = "" 
Finished = False 
while Finished != True: 
    os.system('cls') 
    print("Name: " + myinput) 
    while True: 
     key = ord(getch()) 
     realkey = chr(key) 
     print(key) 
     if key != 0: 
      if key == 13: #Enter 
       Finished = True 
       break 
      else: 
       myinput = myinput + realkey 
       break 

Wenn Sie etwas in der Mini-Schreibmaschine tippen, dann machen Sie einen Fehler und Sie drücken die Rücktaste, es so aussehen, wie es aber tat nichts, wenn Sie eine wieder seltsam Taste drücken wil sie die Zeichen überschrieben werden, je nachdem wie viele Mal, wenn Sie rückwärts gehen, und sogar Würgegriff, wenn Sie mehr als die eingegebene Rücktaste drücken, wird die Ausgabe der Konsole überschrieben. Ich weiß sicher, es ist kein Fehler in meinem Block, es ist nur, wie ASCII funktioniert.

P 
>Name: P 
y 
>Name: Py 
t 
>Name: Pyt 
h 
>Name: Pyth 
o 
>Name: Pytho 
n 
>Name: Python 
(Backspace) 
>Name: Python 
(Backspace) 
>Name: Python 
(Backspace) 
>Name: Python 
K 
>Name: PytKon 
#See?! | 

Warum? und Wie kann ich diesen Fehler beheben? Gibt es eine sauberere Art zu tun, was ich mache? Aber es muss in dem GUI-Stil gemacht werden, den ich gemacht habe. (Wenn das Sinn macht)

Auch ich weiß, dass diese getch() soll alles erfassen, was ich tippe, aber gibt es eine Möglichkeit, nur richtige Zeichen zu erfassen (Grundsätzlich möchte ich meine typewrite wie input()) ohne jeden einzelnen illegalen Char zu konditionieren?

Vielen Dank.

+0

dann vielleicht können Sie wenn Bedingung alle gesetzlichen Zeichen? 'if in legal_chars: tu Zeug? – Bahrom

Antwort

1

Ich vermute, dass Sie die curses Bibliothek verwenden. Wenn Sie sind, können Sie from curses import ascii verwenden, um die ASCII-Werte Zeichen zu erhalten. In diesem Fall können Sie ascii.DEL verwenden, um den Wert der Rücktaste zu erhalten: 127. Die Rücktaste wird oft mit \b geschrieben. Geben Sie einfach print("foo\b\b") in die Python-Shell ein. Sie werden sehen, dass die ganze Zeichenfolge gedruckt wird. Wenn Sie jedoch print("foo\b\bf") tun, wird ffo gedruckt. Dies liegt daran, dass das Zeichen \b den Cursor nur um ein Zeichen nach links bewegt. Es überschreibt nicht wirklich Zeichen mit Leerzeichen, um sie vom Bildschirm zu entfernen. Sie müssen den Rück Charakter als Sondermüll behandeln:

myinput = "" 
Finished = False 
while Finished != True: 
    os.system('cls') 
    print("Name: " + myinput) 
    while True: 
     key = ord(getch()) 
     realkey = chr(key) 
     print(key) 
     if key != 0: 
      if key == 13: #Enter 
       Finished = True 
      elif key == ascii.DEL: 
       myinput = myinput[:-1] 
      else: 
       myinput += realkey 
      break 

bearbeiten: Tatsächliche Code vom OP verwendet:

„ohne jeden illegal char zu, wenn die Bedingung mit“,
from msvcrt import getch 
import os 

Finished = False 
mydict = "" ## my_dict has no special value, just decided to call it that. 

while Finished != True: 
    while True: 
     key = ord(getch()) 
     realkey = chr(key) 
     if key != 0: 
      if key == 13: #Enter 
       Finished = True 
       break 
      elif key == 8: #Backspace 
       my_dict[CurrentItem] = my_dict[CurrentItem][:-1] 
       break 
      elif key in range(32, 127): 
       my_dict[CurrentItem] += realkey 
       break 
+0

Danke zondo, die Sache, die ich am hilfreichsten fand, war, als du erwähntest, dass Sonderzeichen wie Sonderzeichen behandelt werden müssen. Ich habe das Backspace-Problem behoben, allerdings benutze ich die "Curses" -Module nicht. Ich habe versucht, das 'curses'-Modul in einer völlig anderen py-Datei kennenzulernen, aber es macht meine GUI-ähnliche Struktur nutzlos, da es eine völlig eigene GUI-Struktur ist. Gibt es eine Möglichkeit, illegale Charaktere daran zu hindern, hereingelassen zu werden? (Wie Eingabe()) Danke. Auch habe ich vergessen, die Importe in meinem Code oben hinzuzufügen, also habe ich die Änderungen vorgenommen. – user3412975

+0

[Hier] (http://www.asci-i-code.com/) ist eine Tabelle der ASCII-Codes. Sie können entscheiden, was davon erlaubt sein soll. Sie können zum Beispiel sagen, dass es in 'Bereich (32, 128)' sein muss, weil das die druckbaren Zeichen (einschließlich des Löschens) sind, die auf der durchschnittlichen Tastatur sind. Sie können "Bereich (32, 256)" verwenden, um die Zeichen einzubeziehen, die gedruckt werden können, aber nicht auf der durchschnittlichen Tastatur liegen. Vielleicht möchten Sie '10' separat hinzufügen, weil es sich um ein neues Zeilenzeichen handelt. Vielleicht möchtest du ein spezielles Verhalten für Escape hinzufügen, '27'. – zondo