अजगर में प्रमुख प्रेस का पता लगाएं?


103

मैं अजगर में एक स्टॉपवॉच प्रकार का कार्यक्रम बना रहा हूं और मैं जानना चाहूंगा कि कैसे पता लगाया जाए कि क्या एक कुंजी दबाया गया है (जैसे कि रोक के लिए पी और एस के लिए रोकें), और मुझे यह पसंद नहीं है कि कुछ ऐसा हो जैसे कि कच्चे_पुत का इंतजार हो। निष्पादन से पहले उपयोगकर्ता का इनपुट। किसी को पता है कि यह कुछ समय में कैसे करना है?

इसके अलावा, मैं इस क्रॉस-प्लेटफॉर्म को बनाना चाहूंगा, लेकिन अगर यह संभव नहीं है, तो मेरा मुख्य विकास लक्ष्य लिनक्स है


OS X के लिए stackoverflow.com/a/47197390/5638869 पायथन 2 और 3 में काम करता है
neoDev

जवाबों:


69

पायथन में कई विशेषताओं के साथ एक कीबोर्ड मॉड्यूल है। इसे स्थापित करें, शायद इस कमांड के साथ:

pip3 install keyboard

फिर इसका उपयोग कोड की तरह करें:

import keyboard  # using module keyboard
while True:  # making a loop
    try:  # used try so that if user pressed other than the given key error will not be shown
        if keyboard.is_pressed('q'):  # if key 'q' is pressed 
            print('You Pressed A Key!')
            break  # finishing the loop
    except:
        break  # if user pressed a key other than the given key the loop will break

1
मैं लिनक्स के लिए निश्चित नहीं हूं, लेकिन यह मेरे लिए विंडोज पर काम करता है।

72
keyboardजाहिरा तौर पर linux में रूट की आवश्यकता होती है: /
Inaimathi

मैंने इस समाधान की कोशिश की, लेकिन जब मैं इसे स्थापित करने के बाद मॉड्यूल को आयात करने का प्रयास करता हूं, तो मुझे एक "ImportError: कोई मॉड्यूल नहीं मिलता है जिसे 'कीबोर्ड' नाम दिया गया है, इसलिए यह काम नहीं किया। मैंने गिटहब रेपो में जाँच की और मुझे एक संबंधित मुद्दा मिला , लेकिन इससे मुझे समस्या का समाधान नहीं हुआ। फिर, मैंने रेपो को डाउनलोड करने और इसके कुछ उदाहरणों को निष्पादित करने की कोशिश की, लेकिन मुझे लगता है और "ImportError: आपको इस लाइब्रेरी का उपयोग करने के लिए मूल होना चाहिए", जैसा कि @Iimimathi ने पहले टिप्पणी की थी। जाहिरा तौर पर यह पायथन के साथ कीबोर्ड का प्रबंधन करने के लिए एक पूर्ण मॉड्यूल लगता है, लेकिन जड़ की आवश्यकता एक बड़ी कमी है :(
इवानहार्क

3
"एक्स पर निर्भर होने से बचने के लिए, लिनक्स पार्ट्स कच्चे डिवाइस फ़ाइलों (/ देव / इनपुट / इनपुट *) को पढ़ता है लेकिन यह रूट रूट करता है।"
ज्यूकी

7
मैं यह नहीं देखता कि कोशिश क्यों होगी: इसके अलावा: उपयोगी हो।
टाइपिकलहॉग

49

उन लोगों के लिए जो खिड़कियों पर हैं और यहां काम करने का जवाब खोजने के लिए संघर्ष कर रहे थे: खान

from pynput.keyboard import Key, Listener

def on_press(key):
    print('{0} pressed'.format(
        key))

def on_release(key):
    print('{0} release'.format(
        key))
    if key == Key.esc:
        # Stop listener
        return False

# Collect events until released
with Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

ऊपर दी गई फ़ंक्शन जो भी आप कुंजी दबाएंगे, वह 'एस्क' कुंजी जारी करने के साथ-साथ एक कार्रवाई शुरू करेगा। कीबोर्ड प्रलेखन यहाँ एक अधिक भिन्न उपयोग के लिए है।

मार्कस वॉन ब्रॉडी ने एक संभावित मुद्दे पर प्रकाश डाला है: यह उत्तर आपको इस स्क्रिप्ट में वर्तमान विंडो में सक्रिय होने की आवश्यकता नहीं है, विंडोज़ का समाधान होगा:

from win32gui import GetWindowText, GetForegroundWindow
current_window = (GetWindowText(GetForegroundWindow()))
desired_window_name = "Stopwatch" #Whatever the name of your window should be

#Infinite loops are dangerous.
while True: #Don't rely on this line of code too much and make sure to adapt this to your project.
    if current_window == desired_window_name:

        with Listener(
            on_press=on_press,
            on_release=on_release) as listener:
            listener.join()

7
@ nimig18 ... और रूट की आवश्यकता नहीं है :)
cz

1
इस समाधान के साथ एक समस्या है (विकल्पों के बारे में निश्चित नहीं): इसके प्रभावी होने के लिए कुंजी को कंसोल विंडो के अंदर दबाया नहीं जाना चाहिए। एक ऐसी स्क्रिप्ट की कल्पना करें जो ईएससी को दबाए जाने तक कुछ काम करती है, लेकिन फिर आप इसे दूसरे प्रोग्राम में दबाते हैं।
मार्कस वॉन ब्रोडी

1
@MarkusvonBroady मुझे लगता है कि win32gui इसे हल करने के लिए पर्याप्त होगा, मैंने अपना उत्तर इस तरह से संपादित किया है जो संभवतः इसे कम से कम विंडोज़ उपयोगकर्ताओं के लिए हल करेगा।
मिकरेक

@Mitrek मैंने यह कोशिश की, लेकिन मेरा कोड आगे की कार्रवाई को रोक देता है और यहां अटक जाता है। यह इनपुट () की तरह काम करता है। मेरे पास सेलेनियम, फ़ायरफ़ॉक्स में कोड निष्पादित है, लेकिन जैसे ही यह क्रम सामने आता है, आगे कोई कार्रवाई नहीं होती है।
लक्ष्मी नारायणन

1
इसका स्वीकृत उत्तर होना चाहिए था, क्योंकि यह लिनक्स और खिड़कियों दोनों में काम करता है
आकाश कर्नाटक

31

जैसा कि ओपी रॉ_इनपुट का उल्लेख करता है - इसका मतलब है कि वह क्ली समाधान चाहता है। लिनक्स: शाप वह है जो आप चाहते हैं (विंडोज़ पीडीसीआरएस)। Curses, cli सॉफ्टवेयर के लिए एक ग्राफिकल API है, आप केवल महत्वपूर्ण घटनाओं का पता लगाने से अधिक प्राप्त कर सकते हैं।

जब तक नई लाइन को दबाया नहीं जाएगा तब तक यह कोड कुंजियों का पता लगाएगा।

import curses
import os

def main(win):
    win.nodelay(True)
    key=""
    win.clear()                
    win.addstr("Detected key:")
    while 1:          
        try:                 
           key = win.getkey()         
           win.clear()                
           win.addstr("Detected key:")
           win.addstr(str(key)) 
           if key == os.linesep:
              break           
        except Exception as e:
           # No input   
           pass         

curses.wrapper(main)

यह वास्तव में अच्छा है। इसके पार आने से पहले हमेशा के लिए खोजना था। के साथ termiosऔर आसपास हैकिंग की तुलना में बहुत अधिक क्लीनर लगता है ...
ह्यूग पर्किन्स

5
import osउदाहरण के लिए बाहर निकलने में सक्षम होने के लिए जोड़ने की जरूरत है ।
माल्ट

यदि आप इसके win.nodelay(False)बजाय करते हैं True, तो यह प्रति सेकंड एक लाख अपवाद उत्पन्न नहीं करेगा।
जोहान्स हॉफ

24

और भी चीजें हैं, जिनके साथ काम किया जा सकता है keyboard मॉड्यूल के ।

यहाँ कुछ तरीके दिए गए हैं:


विधि # 1:

फ़ंक्शन का उपयोग करना read_key():

import keyboard

while True:
    if keyboard.read_key() == "p":
        print("You pressed p")
        break

यह कुंजी pको दबाए जाने के रूप में लूप को तोड़ने वाला है।


विधि # 2:

समारोह का उपयोग wait:

import keyboard

keyboard.wait("p")
print("You pressed p")

यह प्रेस करने के लिए आपके pकोड को दबाए रखने और जारी रखने का इंतजार करेगा ।


विधि # 3:

फ़ंक्शन का उपयोग करना on_press_key:

import keyboard

keyboard.on_press_key("p", lambda _:print("You pressed p"))

इसे कॉलबैक फ़ंक्शन की आवश्यकता है। मैंनें इस्तेमाल किया_ क्योंकि कीबोर्ड फ़ंक्शन उस फ़ंक्शन को कीबोर्ड इवेंट लौटाता है।

एक बार निष्पादित करने के बाद, यह कुंजी को दबाए जाने पर फ़ंक्शन चलाएगा। आप इस लाइन को चलाकर सभी हुक बंद कर सकते हैं:

keyboard.unhook_all()

विधि # 4:

यह विधि पहले से ही उपयोगकर्ता 8167727 द्वारा उत्तर दी गई है, लेकिन मैं उनके द्वारा बनाए गए कोड से असहमत हूं। यह फ़ंक्शन का उपयोग कर रहा होगा is_pressedलेकिन दूसरे तरीके से:

import keyboard

while True:
    if keyboard.is_pressed("p"):
        print("You pressed p")
        break

pदबाए जाने पर यह लूप को तोड़ देगा ।


टिप्पणियाँ:

  • keyboard पूरे ओएस से keypresses पढ़ेंगे।
  • keyboard लाइनक्स पर रूट की आवश्यकता होती है

11
कीबोर्ड मॉड्यूल का उपयोग करने का सबसे बड़ा NEGATIVE इसकी आवश्यकता है जिसे आप ROOT उपयोगकर्ता के रूप में चलाते हैं। यह मेरे कोड में मॉड्यूल वर्बोटन बनाता है। बस चुनाव करने के लिए कि क्या एक कुंजी दबाया गया है, रूट विशेषाधिकारों की आवश्यकता नहीं है। मैंने डॉक्टर को पढ़ा है और समझा है कि सीमा क्यों मॉड्यूल में बाहर निकलती है, लेकिन कहीं और देखें यदि आपको एक कुंजी को पोल करने की आवश्यकता है ...
मूमेंट

बहुत उपयोगी जानकारी साझा की, सर! मैं जानना चाहता था कि क्या मैं keyboard.wait()1 से अधिक कुंजी के लिए प्रतीक्षा करने के लिए उपयोग कर सकता हूं , और यदि उनमें से किसी को दबाया जाता है, तो जारी रखें
प्रीतिकरन सिंह

@PreetkaranSingh wait()यह कार्यक्षमता नहीं देता है। आपको keyboard.read_key()थोड़ी देर के लूप में पैक की गई शर्त के साथ उपयोग करना होगा । विधि # 1
ब्लैक थंडर

धन्यवाद सर !, क्या आप suppressकीवर्ड उपयोग पर कुछ प्रकाश डालना चाहेंगे keyboard.read_key(), इसका उपयोग कब करना है और कब नहीं ....
प्रीतिकरन सिंह

@PreetkaranSingh मैं करूँगा लेकिन मेरे पास दमन तर्क के बारे में पर्याप्त जानकारी नहीं है
ब्लैक थंडर

13

के लिए विंडोज आप इस्तेमाल कर सकते हैं msvcrtइस तरह:

   import msvcrt
   while True:
       if msvcrt.kbhit():
           key = msvcrt.getch()
           print(key)   # just to show the result

7
msvcrt एक विंडोज-केवल मॉड्यूल है।
डुनोटोटैटोस

1
मैं वास्तव में अब pynput का उपयोग करता हूं, जो एक बेहतर जवाब हो सकता है
Benjie

ध्यान दें कि ओएस एक्स पर काम करने के लिए pynput (लिनक्स के बारे में पता नहीं) को काम करने के लिए रूट के रूप में चलना होगा। यह कुछ लोगों के लिए एक गैर स्टार्टर हो सकता है।
गाबे वीस

मैं शपथ ले सकता था कि प्रश्न 'क्रॉस-प्लेटफॉर्म' या 'लिनक्स' के लिए था ...
हारून मान

10

किस कुंजी को दबाया जाए इसके लिए इस कोड का उपयोग करें

from pynput import keyboard

def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    print('{0} released'.format(
        key))
    if key == keyboard.Key.esc:
        # Stop listener
        return False

# Collect events until released
with keyboard.Listener(
        on_press=on_press,
        on_release=on_release) as listener:
    listener.join()

हालांकि यह बात है, मैं macOS का उपयोग कर रहा हूं और दोनों pynput और कीबोर्ड को अलग से स्थापित किया है, और कार्यक्रम बिना किसी त्रुटि के चलता है, लेकिन केवल (अजगर शेल पर) विशेष कुंजी का पता लगा सकता है। अक्षरांकीय कुंजियों का पता नहीं लगाया जाता है और इसके विपरीत, माना जाता है जैसे कि मैं शेल पर कोड लिख रहा था। क्या आप जानते हैं कि यह मुद्दा क्या हो सकता है?
डारियो डेनिज एर्गुएन

उसी कोड ने मेरे लिए शेल में काम किया। कृपया यह जाँचें। कीबोर्ड पैकेज को इस कोड की आवश्यकता नहीं है।
मणिवन्नन मुरुगावेल

1
यह linux में जाने का तरीका है, क्योंकि कीबोर्ड lib की जड़ है।
डेविड

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

6

एक विंडो रखने के लिए PyGame का उपयोग करें और फिर आप प्रमुख घटनाओं को प्राप्त कर सकते हैं।

पत्र के लिए p:

import pygame, sys
import pygame.locals

pygame.init()
BLACK = (0,0,0)
WIDTH = 1280
HEIGHT = 1024
windowSurface = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)

windowSurface.fill(BLACK)

while True:
    for event in pygame.event.get():
        if event.key == pygame.K_p: # replace the 'p' to whatever key you wanted to be pressed
             pass #Do what you want to here
        if event.type == pygame.locals.QUIT:
             pygame.quit()
             sys.exit()

2

इसलिए मैंने इस पोस्ट को .. इस पोस्ट (msvcr लाइब्रेरी और पायथन 3.7 का उपयोग करके) के आधार पर बनाया।

निम्नलिखित खेल का "मुख्य कार्य" है, जो दबाए गए कुंजी का पता लगा रहा है:

# Requiered libraries - - - -
import msvcrt
# - - - - - - - - - - - - - -


def _secret_key(self):
    # Get the key pressed by the user and check if he/she wins.

    bk = chr(10) + "-"*25 + chr(10)

    while True:

        print(bk + "Press any key(s)" + bk)
        #asks the user to type any key(s)

        kp = str(msvcrt.getch()).replace("b'", "").replace("'", "")
        # Store key's value.

        if r'\xe0' in kp:
            kp += str(msvcrt.getch()).replace("b'", "").replace("'", "")
            # Refactor the variable in case of multi press.

        if kp == r'\xe0\x8a':
            # If user pressed the secret key, the game ends.
            # \x8a is CTRL+F12, that's the secret key.

            print(bk + "CONGRATULATIONS YOU PRESSED THE SECRET KEYS!\a" + bk)
            print("Press any key to exit the game")
            msvcrt.getch()
            break
        else:
            print("    You pressed:'", kp + "', that's not the secret key(s)\n")
            if self.select_continue() == "n":
                if self.secondary_options():
                    self._main_menu()
                break

यदि आप पोरग्राम का पूर्ण स्रोत कोड चाहते हैं, तो आप इसे देख सकते हैं या इसे यहाँ से डाउनलोड कर सकते हैं:

गुप्त कुंजी खेल (GitHub)

(नोट: गुप्त कुंजी है: Ctrl+F12 )

मुझे उम्मीद है कि आप एक उदाहरण के रूप में सेवा कर सकते हैं और उन लोगों के लिए मदद कर सकते हैं जो इस जानकारी से परामर्श करने के लिए आते हैं।



1
key = cv2.waitKey(1)

यह ओपनसीवी पैकेज से है। यह प्रतीक्षा किए बिना एक कुंजी का पता लगाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.