2012-11-01 14 views
46

मैं सीरियल डेटा पढ़ रहा हूं और थोड़ी देर लूप का उपयोग कर एक सीएसवी फ़ाइल में लिख रहा हूं। मैं चाहता हूं कि उपयोगकर्ता लंबे समय तक लूप को मारने में सक्षम हो जाए, जब उन्हें लगता है कि उन्होंने पर्याप्त डेटा एकत्र किया है।एक कीस्ट्रोक के साथ थोड़ी देर लूप को कैसे मारें?

while True: 
    #do a bunch of serial stuff 

    #if the user presses the 'esc' or 'return' key: 
     break 

मैं इस opencv का उपयोग कर की तरह कुछ किया है, लेकिन यह इस आवेदन में काम किया जाना प्रतीत नहीं होता है (और मैं सच में वैसे भी सिर्फ इस समारोह के लिए opencv आयात करने के लिए नहीं करना चाहते हैं) ...

 # Listen for ESC or ENTER key 
     c = cv.WaitKey(7) % 0x100 
     if c == 27 or c == 10: 
      break 

तो। मैं उपयोगकर्ता को लूप से कैसे बाहर निकलने दे सकता हूं?

इसके अलावा, मैं क्योंकि स्क्रिप्ट के बाद, जबकि पाश समाप्त होता है को चलाने के लिए जारी रखने की जरूरत, कीबोर्ड बाधा उपयोग करने के लिए नहीं करना चाहती।

उत्तर

80

सबसे आसान तरीका है बस हमेशा की तरह Ctrl-C (SIGINT) के साथ यह बाधित करने के लिए है।

try: 
    while True: 
     do_something() 
except KeyboardInterrupt: 
    pass 

Ctrl-C कारणों के बाद से KeyboardInterrupt उठाया जा, बस इसे लूप के बाहर पकड़ने और इसे अनदेखा।

+1

@Chris: क्यों तुम इसे आजमाइए नहीं है। (और फिर टिप्पणी करें) – SilentGhost

+0

मैंने टिप्पणी के ठीक बाद किया ... इसे हटाने के लिए भूल गए। मैंने इस उत्तर को स्वीकार्य के रूप में चिह्नित किया है। – Chris

+0

यह क्रैश (मुझे त्रुटि ट्रेस वापस मिलती है) '^_'' do_something() 'में जारी की जाती है। आप इससे कैसे बच सकते हैं? – Atcold

4

pyHook मदद कर सकता है। http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial#tocpyHook%5FTutorial4

देखें कुंजीपटल हुक; यह अधिक सामान्यीकृत है - यदि आप विशिष्ट कीबोर्ड इंटरैक्शन चाहते हैं और केवल कीबोर्ड इंटरप्ट का उपयोग नहीं करते हैं।

इसके अलावा, सामान्य रूप में (आपके उपयोग के आधार पर) मुझे लगता है कि मारने के लिए अपनी स्क्रिप्ट समझ में आता है Ctrl-C विकल्प अभी भी उपलब्ध है। Detect in python which keys are pressed

18

वहाँ एक समाधान है कि कोई गैर मानक मॉड्यूल की आवश्यकता है और निम्नलिखित कोड मेरे लिए काम करता है 100% परिवहनीय

import thread 

def input_thread(a_list): 
    raw_input() 
    a_list.append(True) 

def do_stuff(): 
    a_list = [] 
    thread.start_new_thread(input_thread, (a_list,)) 
    while not a_list: 
     stuff() 
+1

पायथन 3+ का उपयोग करने वालों के लिए बस एक नोट: raw_input() का नाम बदलकर इनपुट() कर दिया गया है, और थ्रेड मॉड्यूल अब _thread है। – Wieschie

+0

पायथन 3 डॉक्स के अनुसार, पायथन 3 में काम नहीं किया: "थ्रेड इंटरप्ट्स के साथ अजीब तरह से बातचीत करते हैं: कीबोर्ड इंटरप्ट अपवाद एक मनमाना धागे द्वारा प्राप्त किया जाएगा। (जब सिग्नल मॉड्यूल उपलब्ध होता है, तो इंटरप्ट हमेशा मुख्य धागे पर जाते हैं।) " – Towhid

+0

@Towhid लेकिन यह इंटरप्ट्स का उपयोग नहीं करता है। यह stdin से पढ़ने का उपयोग करता है। – Artyer

6

है:

भी पिछले प्रश्न देखें। इसे ओपनसीवी (आयात सीवी 2) की आवश्यकता है।

कोड एक अनंत लूप से बना है जो लगातार एक कुंजी दबाए हुए हैं। इस मामले में, जब 'क्यू' कुंजी दबाया जाता है, तो प्रोग्राम समाप्त होता है। अन्य क्रियाओं को दबाया जा सकता है (इस उदाहरण में 'बी' या 'के') अलग-अलग क्रियाएं करने के लिए जैसे वैरिएबल वैल्यू बदलना या फ़ंक्शन निष्पादित करना।

import cv2 

while True: 
    k = cv2.waitKey(1) & 0xFF 
    # press 'q' to exit 
    if k == ord('q'): 
     break 
    elif k == ord('b'): 
     # change a variable/do something ... 
    elif k == ord('k'): 
     # change a variable/do something ... 
+2

अच्छा, लेकिन सीवी 2 बहुत भारी है, जब तक कि आप इसे किसी और चीज़ के लिए पहले से ही उपयोग नहीं कर रहे हैं। – ogurets

संबंधित मुद्दे