2012-12-22 16 views
6

Python'da bir küfür programı yazdım. İyi çalışıyor. Bununla birlikte, nodelay()'u kullandığımda, hiç bir şey gösterilmeden (yalnızca yeni bir komut istemi), terminalden sonra program hemen çıkar.nodelay() python curses programının çıkmasına neden oluyor

Bu kod hata yeniden edecek

DÜZENLEME:

 
sc = curses.initscr() 

sc.nodelay(1) # But removing this line allows the program to run properly 

for angry in range(20): 
     sc.addstr(angry, 1, "hi") 

İşte benim tam kod

 
import curses, time, sys, random 

def paint(x, y, i): 
     #... 
def string(s, y): 
     #... 

def feed(): 
     #... 

sc = curses.initscr() 
curses.start_color() 
curses.curs_set(0) 
sc.nodelay(1) ######################################### 

# vars + colors inited 

for angry in range(20): 
     try: 
       dir = chr(sc.getch()) 

       sc.clear() 

       feed() 

       #lots of ifs 

       body.append([x, y]) 
       body.pop(0) 

       for point in body: 
         paint(*point, i=2) 

       sc.move(height-1, 1) 
       sc.refresh() 
       time.sleep(wait) 

     except Exception as e: 
       print sys.exc_info()[0], e 

sc.getch() 
curses.beep() 

curses.endwin() 

Neden bu happenning olduğunu, ve nasıl nodelay() güvenle kullanabilir?sc.nodelay() hat olmadan veya ile küçük test programını çalıştırırken

+1

Hatanızı çoğaltmak için gerekli olan en düşük değere kodlamayı deneyin. Örneğin, nodelay() öğesini ayarlayabilir, ardından bir anahtarı() atarken kırılan ve çıkan sonsuz bir döngüye girebilirsiniz. Hata minimum test durumunda kaybolursa, neyin değiştiğini anlayın. Bu başarısız test vakasının gönderilmesine yardımcı olmazsa. – Philip

+0

@Philip iyi düşün, bunu yaptın ve sonuçları yayınladı. – ACarter

cevap

5

Çalışmaya temel işlevlerini almak için küçültülmüş demo yeniden kaleme aldık. Blokajsız bir getch var(). Getch() çağrıldığında Q tuşunu basılı tutarsanız, program sona erer, aksi halde döngü devam eder.

import curses, time 

def main(sc): 
    sc.nodelay(1) 

    for angry in range(20): 
     sc.addstr(angry, 1, "hi") 
     sc.refresh() 

     if sc.getch() == ord('q'): 
      break 

     time.sleep(1) 

if __name__=='__main__': 
    curses.wrapper(main) 

yaptığım en önemli değişiklik yerine curses.initscr kullanarak bir ekran içerik() almak için curses.wrapper kullanıyor. Faydası, eğer programınız yakalanmamış bir istisna vurursa (örneğin^C'ye vurursa), terminalden çıkmadan önce imleci devre dışı bırakmak gibi yaptığınız tüm değişiklikleri geri alır. Hata ayıkladığınızda çok yardımcı olur.

Buradan, programınızın özelliklerini çok küçük adımlarla tekrar eklemenizi öneririz. Curses, çalışmak için acıdır ve bir anda çok fazla değişiklik yaparsanız, hangisinin bir şeyin kırılmasına neden olduğunu anlamak zordur. İyi şanslar!

+1

Çözüldü. Ana sarmalayıcıyı eklemek, 'getch() 'hiçbir şey döndürmediğinde (herhangi bir girdi bulunmadığında) bir hataya neden olduğumu görmeme izin verdi ve kullanılamayan chr()' ye koyulmaya çalışıldı. hiçbir şey değil. Yardımınız için teşekkürler, bu diğer hataları çözerken gerçekten yararlı olacaktır. – ACarter

0

Ben hiçbir fark görüyorum. Ne durumda ekranda bir şey yazdırır

...

+0

Buradaki nokta şudur ki, sc.nodelay() 'ile bir lanet pencereleri bile açılmamaktadır, dolayısıyla hiçbir şey yapamam, çünkü bunu yapacak hiçbir şey yoktur. – ACarter