2012-12-22 18 views
6

से बाहर निकलने के लिए पाइथन शाप प्रोग्राम का कारण बनता है मैंने पायथन में एक शाप कार्यक्रम लिखा है। यह ठीक चलाता है। हालांकि, जब मैं nodelay() का उपयोग करता हूं, तो प्रोग्राम टर्मिनल में शुरू होने के तुरंत बाद बाहर निकलता है, जिसमें कुछ भी दिखाया नहीं जाता है (केवल एक नया संकेत)।नोडेल()

संपादित

इस कोड बग पुन: पेश होगा:

 
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() सेट कर सकते हैं, फिर एक अनंत लूप में जाएं जो टूट जाता है और बाहर निकलता है जब आप एक कुंजी प्राप्त करते हैं। यदि न्यूनतम परीक्षण मामले में बग चला जाता है तो पता चलता है कि क्या बदला गया है। अगर वह असफल परीक्षण मामले को पोस्ट करने में मदद नहीं करता है। – Philip

+0

@ फिलिप अच्छी सोच, ऐसा किया है, और परिणाम पोस्ट किया है। – ACarter

उत्तर

5

मैं बुनियादी काम कर कार्यक्षमता प्राप्त करने के लिए अपने minified डेमो फिर से लिख दिया। यह एक nonblocking getch() मिला है। यदि आप getch() कहलाते हैं तो क्यू कुंजी धारण कर रहे हैं, प्रोग्राम समाप्त होता है, अन्यथा लूप जारी रहता है।

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 का उपयोग करने का एक स्क्रीन संदर्भ() प्राप्त करने के लिए। लाभ यह है कि यदि आपका प्रोग्राम एक अपरिचित अपवाद (उदाहरण के लिए^सी मारना) हिट करता है तो यह टर्मिनल में किए गए सभी परिवर्तनों को पूर्ववत करता है जैसे बाहर निकलने से पहले कर्सर को अक्षम करना। जब आप डिबगिंग करते हैं तो यह बहुत मदद करता है।

यहां से मैं आपके कार्यक्रम की विशेषताओं को बहुत छोटे चरणों में वापस जोड़ने की अनुशंसा करता हूं। शापित व्यक्ति के साथ काम करने के लिए दर्द होता है और यदि आप एक बार में बहुत सारे बदलाव करते हैं तो यह पता लगाना मुश्किल होता है कि किसने चीजों को तोड़ दिया। सौभाग्य!

+1

हल हो गया। मुख्य रैपर जोड़ने से मुझे यह देखने की इजाजत मिली कि मैं एक त्रुटि के कारण बाहर निकल रहा था जब 'getch()' कुछ भी नहीं लौटाया (क्योंकि कोई इनपुट उपलब्ध नहीं था), और 'chr()' में डालने की कोशिश की गई थी, जो संभाल नहीं सकता कुछ भी तो नहीं। आपकी सहायता के लिए धन्यवाद, अन्य बग को हल करते समय यह वास्तव में उपयोगी होगा। – ACarter

0

मैं जबsc.nodelay() लाइन के बिना या के साथ अपने छोटे से परीक्षण कार्यक्रम चल रहा कोई अंतर नहीं देखते हैं।

न तो मामले स्क्रीन पर कुछ भी प्रिंट ...

+0

मुद्दा यह है कि मेरे लिए, 'sc.nodelay() 'के साथ, एक शाप खिड़कियां भी खोली नहीं जाती हैं, और इसलिए मैं कुछ भी नहीं कर सकता, क्योंकि ऐसा करने के लिए कुछ भी नहीं है। – ACarter