2012-12-22 42 views
6

我已經在Python中編寫了一個curses程序。它運行良好。但是,當我使用nodelay()時,程序在終端中啓動後立即退出,完全沒有任何顯示(僅提示新提示)。nodelay()導致python curses程序退出

編輯

此代碼將重現錯誤:

 
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") 

這裏是我完整的代碼

 
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() 

這是爲什麼happenning,我怎麼可以使用nodelay()安全?

+1

嘗試將您的代碼降低到重現錯誤所需的最小值。例如,你可以設置nodelay(),然後進入一個無限循環,當你getch()一個鍵時,循環會中斷並退出。如果錯誤在最小測試案例中消失,找出發生了什麼變化。如果這無助於發佈失敗的測試用例。 – Philip

+0

@Philip好思想,已經這樣做了,併發布了結果。 – ACarter

回答

5

我已經重寫你的演示縮小的獲取工作的基本功能。它有一個非阻塞的getch()。如果在調用getch()時按住Q鍵,則程序結束,否則循環繼續。

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) 

我所做的最顯著的變化是用curses.wrapper獲得)在屏幕方面,而不是使用curses.initscr(。好處是,如果你的程序碰到一個未捕獲的異常(例如命中^ C),它會退出你對終端所做的所有更改,如在退出之前禁用光標。當您正在調試時,它會有很大的幫助。

從這裏我建議回到非常小的步驟添加您的程序功能。詛咒是一種痛苦的工作,如果你一次做了很多改變,很難找出哪一個會導致事情破裂。祝你好運!

+1

解決。當getch()不返回任何內容(因爲沒有可用的輸入),並且試圖將其放入'chr()'中,無法處理它時,添加主包裝讓我看到我正在退出,沒有。感謝您的幫助,這在解決其他錯誤時非常有用。 – ACarter

0

我看不的sc.nodelay()符合或運行你的小測試程序時沒有區別。

兩種情況下打印屏幕上的任何...

+0

關鍵是,對於我來說,使用'sc.nodelay()',curses窗口甚至不會打開,因此我什麼也做不了,因爲沒有什麼可以做的。 – ACarter

相關問題