2015-12-28 3 views
8

अभी मैं रास्पबेरी पाई और एक मेकी मेकी के साथ एक छोटा कोड बनाने की कोशिश कर रहा हूं। मेकी मेकी एक छोटा बोर्ड है जो कुछ संपर्क संचालित होने पर यूएसबी कीबोर्ड के रूप में कार्य करता है। मेरा सवाल यह है कि एक पाइथन लिपि के अंदर उन कीप्रेसों का पता लगाने का सबसे आसान तरीका क्या है। मैं समझता हूं कि जीपीआईओ पिन का उपयोग करना आसान होगा, लेकिन अभी मैं इसे ढूंढ रहा हूं। मैंने psgame.key का उपयोग करके और getKey का उपयोग करके msvcrt (जो मैं समझता हूं केवल विंडोज़ है) से getch() का उपयोग कर उदाहरणों को देखा है। इनमें से कौन सा अभ्यास उपयोग करना सबसे आसान है? क्या कोई ऐसा है जो दबाए जा रहे कुंजी और एक कुंजी जारी किया जा सकता है?लिनक्स मशीन पर पायथन 3 में महत्वपूर्ण प्रेस का पता लगाने का सबसे आसान तरीका क्या है?

स्यूडोकोड कोड

import whatever needs importing  

if the "W" key is pressed: 
    print ("You pressed W") 

elif the "S" is pressed: 
    print ("You pressed S") 

और इतने पर (... कि क्या यह कहा जाता है?)। धन्यवाद।

+0

आप कुंजी बाइंडिंग के साथ ग्राफिकल इंटरफेस देख सकते हैं tk: https://docs.python.org/3/library/tk.html – LittleByBlue

उत्तर

9

यह एक साधारण लूप है जो एकल अक्षरों को प्राप्त करने के लिए कच्चे मोड में स्टडीन डाल देगा (बफरिंग को अक्षम करने के लिए आपको एंटर दबाएं नहीं)। आप (अक्षम करने के with बयान की तरह) कुछ होशियार करना चाहिए लेकिन आप यहां विचार प्राप्त:

import tty 
import sys 
import termios 

orig_settings = termios.tcgetattr(sys.stdin) 

tty.setraw(sys.stdin) 
x = 0 
while x != chr(27): # ESC 
    x=sys.stdin.read(1)[0] 
    print("You pressed", x) 

termios.tcsetattr(sys.stdin, termios.TCSADRAIN, orig_settings)  

मुझे लगता है कि आप अजगर में महत्वपूर्ण विज्ञप्ति पता लगाने के लिए पाश होगा।

ईटीए कुछ और स्पष्टीकरण:

लिनक्स पर, अपने कार्यक्रम के लिए इनपुट लाइन हो जाएगा बफ़र। इसका अर्थ यह है कि ऑपरेटिंग सिस्टम पूरी लाइन तक इनपुट बफर करेगा, इसलिए आपका प्रोग्राम उपयोगकर्ता द्वारा टाइप किए गए कुछ भी नहीं देखेगा जब तक कि उपयोगकर्ता 'एंटर' हिट न करे। दूसरे शब्दों में, यदि आपका प्रोग्राम उपयोगकर्ता को 'डब्ल्यू' टाइप करने की उम्मीद कर रहा है और उपयोगकर्ता ऐसा करता है, तो 'डब्ल्यू' ओएस के बफर में बैठा होगा जब तक कि उपयोगकर्ता 'एंटर' हिट न करे। इस बिंदु पर पूरी लाइन आपके प्रोग्राम में वितरित की जाती है ताकि आपको उपयोगकर्ता के इनपुट के रूप में स्ट्रिंग "w \ n" मिल जाएगी।

आप टीटी को कच्चे मोड में डालकर इसे अक्षम कर सकते हैं। आप इसे पायथन फ़ंक्शन tty.setraw के साथ करते हैं जो बफरिंग को रोकने के लिए लिनक्स में tty ड्राइवर को कॉल करने के लिए कॉल करेगा। मैंने इसे sys.stdin तर्क दिया कि यह कहने के लिए कि मैं कौन सी धारा के लिए बफरिंग बंद करना चाहता हूं। तो tty.setraw कॉल के बाद, ऊपर लूप आपको उपयोगकर्ता की प्रत्येक कुंजी के लिए आउटपुट देगा।

हालांकि, एक जटिलता यह है कि एक बार आपका प्रोग्राम निकलता है, तो टीटी अभी भी कच्चे मोड में है।आपको आम तौर पर यह असंतुष्ट लगता है क्योंकि आपको आधुनिक टर्मिनल सेटिंग्स की पेशकश करने वाली कोई भी शक्ति नहीं मिलती है (जैसे कि जब आप नियंत्रण या भागने के दृश्यों का उपयोग करते हैं)। उदाहरण के लिए, ध्यान दें कि आपको ctrl-C के साथ प्रोग्राम से बाहर निकलने में परेशानी हो सकती है। नतीजतन आपको इनपुट वर्ण पढ़ने के बाद टर्मिनल को वापस पकाया गया मोड में रखना चाहिए। termios.tcsetattr कॉल बस कहता है "टर्मिनल को जिस तरह से मैंने पाया उसे वापस रखें"। यह जानता है कि कार्यक्रम की शुरुआत में termios.tcgetattr पर कॉल करके इसे कैसे करें, जो कह रहा है "मुझे टर्मिनल के लिए सभी मौजूदा सेटिंग्स बताएं"।

एक बार जब आप इसे समझ लेंगे, तो आपको आसानी से उस फ़ंक्शन में कार्यक्षमता को समाहित करने में सक्षम होना चाहिए जो आपके प्रोग्राम के अनुरूप है।

stdin वह स्ट्रीम है जो उपयोगकर्ता से इनपुट आपके पास आता है। विकिपीडिया आपको standard streams के बारे में और बता सकता है।

+0

अच्छा नहीं है। कई अन्य स्थितियों में बहुत आसान, – LittleByBlue

+0

ऐसा लगता है कि मैं इसका उपयोग करना चाहता हूं, (यह पीआई पर आश्चर्यजनक रूप से काम करता है), लेकिन मैं बिल्कुल स्पष्ट नहीं हूं कि मैं क्या कर रहा हूं। क्या आप इस पर किसी भी नोब फ्रेंडली दस्तावेज के बारे में जानते हैं? क्या आप अपना कोड तोड़ सकते हैं, या मुझे बता सकते हैं कि अगर किसी कथन में इसका इस्तेमाल कैसे किया जाए? – montainz09

+0

@ montainz09 मैंने कुछ और स्पष्टीकरण जोड़ा। मुझे आशा है कि वह मदद करेंगे। – Turn

8

एक अच्छा हल्के मॉड्यूल curtsies आप कुछ इस तरह कर सकता है का उपयोग करना (उनके उदाहरण/निर्देशिका से लिया गया):

'a' 
's' 
'KEY_F(1)' 
'KEY_F(2)' 
'KEY_F(3)' 
'KEY_F(4)' 
'KEY_F(5)' 
'KEY_LEFT' 
'KEY_DOWN' 
'KEY_UP' 
'KEY_RIGHT' 
'KEY_NPAGE' 
'\n' 
:

from curtsies import Input 

def main(): 
    with Input(keynames='curses') as input_generator: 
     for e in input_generator: 
      print(repr(e)) 

if __name__ == '__main__': 
    main() 

तो अपने कीबोर्ड पर दबाने चाबियाँ आप कुछ इस तरह देता है

curtsies bpython द्वारा टर्मिनल से संबंधित सामानों के निम्न स्तर के अबास्ट्रक्शन के रूप में उपयोग किया जाता है।

इनपुट डीकोड करने की मूल समस्या यह है कि विभिन्न टर्मिनल और टर्मिनल एमुलेटर प्रोग्राम जैसे xterm या gnome-terminals शारीरिक रूप से एक ही कुंजी अलग-अलग कुंजीकोड अनुक्रम उत्पन्न करती है। यही कारण है कि किसी को यह जानने की जरूरत है कि इनपुट को डीकोड करने के लिए कौन सी टर्मिनल सेटिंग्स का उपयोग किया जाना चाहिए। ऐसा मॉड्यूल उन गौरी विवरणों से अमूर्त करने में मदद करता है।

+0

यह समाधान मेरे लिए सबसे अच्छा है क्योंकि यह 'KEY_UP' (दूसरों के बीच) को संभालता है जबकि स्वीकृत उत्तर – vinzee

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

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