2016-03-30 19 views
0

Ana soru, python programımın yapılış biçimi için, bir tuşa basıldığında GUI gibi yenilenen programım için bir daktilo oluşturmaya çalışıyorum. Ancak, ASCII özellikle Backspace ile garip bir problemle karşılaşıyorum. mini daktilo şey yazdığınızPython 3.4: getch() - Bir Daktilo - 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 

, o zaman ancak hiçbir şey yaptığım gibi kaç bağlı o kömürü üzerine wil tuşuna tekrar garip bastığınızda görünmesi, bir hata yaparsanız ve Backspace tuşlarına basın geri döndüğünüz zamanlar, ve hatta daha sonra geri yazdıysanız bile, aslında konsol çıkışlarının üzerine yazacaksınız. Eminim ki bu benim bloğumdaki bir hata değil, ASCII'nin nasıl işlediği.

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?! | 

Neden? ve Bu hatayı nasıl düzeltebilirim? Yaptığım şeyi yapmanın daha temiz bir yolu var mı? Ama yaptığım GUI tarzında yapılmalı. (Eğer bu mantıklıysa)

Ayrıca, bu getch() 'in yazdığım herşeyi yakalamasının gerektiğini biliyorum, ancak sadece uygun karakterleri yakalamanın bir yolu var mı (Temel olarak benim tip yazmamın girdi() gibi olmasını istiyorum) Her yasadışı char şartına sahip olmadan?

Teşekkür ederiz.

+0

, o zaman belki can tüm yasal karakterlerin durumu varsa? Eğer legal_chars içinde inp varsa: bir şeyler yap? – Bahrom

cevap

1

curses kitaplığını kullandığınızı tahmin ediyorum. ise, karakterlerinin ASCII değerlerini almak için from curses import ascii kullanabilirsiniz. Bu durumda, backspace anahtarının değerini almak için ascii.DEL'u kullanabilirsiniz: 127. Backspace anahtarı genellikle \b ile yazılmıştır. Sadece Python kabuğuna print("foo\b\b") yazmayı deneyin. , tüm dizenin yazdırıldığını göreceksiniz. print("foo\b\bf") yaparsanız, ffo yazdırılır. Bunun nedeni, \b karakterinin imleci sola doğru bir karakterle hareket ettirmesidir. Bu , ekranda ekranından kaldırmak için boşluk bulunan karakterlerin üzerine yazmaz. Sen gibi özel backspace karakterini tedavi etmek gerekir:

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 

Düzenleme: OP tarafından kullanılan Fiili kodu: "koşulu ise her tek kaçak kömürün gerek kalmadan"

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

Teşekkürler zondo, en çok yardımcı bulduğum şey, özel karakterlerin özel karakterler gibi ele alınması gerektiğini belirttiğinizde oldu. Backspace sorununu çözdüm, ancak 'lanet' modüllerini kullanmıyorum. Ben tamamen farklı bir py dosyasında 'lanet' modülünü tanımak için çalıştım, ancak kendi GUI yapısı olması nedeniyle GUI benzeri yapımı işe yaramaz hale getirir. Yasaklı karakterlerin girilmesinin engellenmesinin bir yolu var mı? (Giriş() gibi) Teşekkürler. Ayrıca yukarıdaki kodumdaki değişiklikleri eklemeyi unuttum, böylece değişiklikleri yaptım. – user3412975

+0

[Burada] (http://www.ascii-code.com/) ascii kodlarının bir tablosu. Neye izin verileceğine karar verebilirsiniz. Örneğin, "32 (128)" aralığında olması gerektiğini söyleyebilirsiniz, çünkü bunlar ortalama klavyede bulunan yazdırılabilir karakterlerdir (silme dahil). Yazdırılabilen karakterleri içermekle birlikte, ortalama klavyede olmayanları (32, 256) 'kullanmak isteyebilirsiniz. Yeni bir satır karakteri olduğu için 10'u ayrı ayrı eklemek isteyebilirsiniz. Belki kaçış için özel davranış eklemek istersiniz, 27. – zondo