পাইথন কী প্রেস আবিষ্কার?


113

আমি অজগরটিতে স্টপওয়াচ টাইপ প্রোগ্রাম তৈরি করছি এবং কী কী চাপছে তা সনাক্ত করার জন্য আমি কীভাবে জানতে চাই (যেমন থামার জন্য পি এবং থামার জন্য গুলি), এবং আমি এটি কাঁচা_পিন্ডের মতো অপেক্ষা করতে চাই যা এটির জন্য অপেক্ষা করে চালিয়ে যাওয়ার আগে ব্যবহারকারীর ইনপুট। কিছুক্ষণের মধ্যে কীভাবে এটি করা যায় জানেন?

এছাড়াও, আমি এই ক্রস প্ল্যাটফর্মটি তৈরি করতে চাই, তবে যদি এটি সম্ভব না হয় তবে আমার মূল বিকাশের লক্ষ্যটি লিনাক্স


জন্য OS X এর stackoverflow.com/a/47197390/5638869 পাইথন 2 এবং 3 কাজ করে
neoDev

উত্তর:


78

পাইথনের অনেকগুলি বৈশিষ্ট্য সহ একটি কীবোর্ড মডিউল রয়েছে। এটি ইনস্টল করুন, সম্ভবত এই আদেশ দিয়ে:

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

4
আমি লিনাক্সের বিষয়ে নিশ্চিত নই তবে এটি আমার জন্য উইন্ডোজে কাজ করে।

84
keyboardআপাতদৃষ্টিতে লিনাক্সের মূলের প্রয়োজন: /
ইনাইমাথি

আমি এই সমাধানটি চেষ্টা করেছি তবে যখন আমি মডিউলটি ইনস্টল করার পরে আমদানি করার চেষ্টা করি তখন আমি একটি "আমদানি ত্রুটি: 'কীবোর্ড' নামে কোনও মডিউল পাই না", সুতরাং এটি কার্যকর হয়নি। আমি গিটহাব রেপোতে চেক করেছি এবং আমি একটি সম্পর্কিত সমস্যা পেয়েছি , তবে এটি আমার সমস্যার সমাধান করে না। তারপরে, আমি রেপো ডাউনলোড করার এবং এর কয়েকটি উদাহরণ সম্পাদনের চেষ্টা করেছি তবে আমি পেয়েছি এবং "আমদানি ত্রুটি: লিনাক্সে এই লাইব্রেরিটি ব্যবহার করার জন্য আপনাকে অবশ্যই মূল হতে হবে", যেমন @ আইনাথী মন্তব্য করেছিলেন। স্পষ্টতই পাইথনের সাহায্যে কীবোর্ড পরিচালনা করার জন্য এটি একটি সম্পূর্ণ মডিউল বলে মনে হচ্ছে, তবে মূলের প্রয়োজনের একটি বড় অভাব :(
ইভানহেরাকাজ

4
"এক্স এর উপর নির্ভর করে এড়ানোর জন্য, লিনাক্স অংশগুলি কাঁচা ডিভাইস ফাইলগুলি (/ dev / ইনপুট / ইনপুট *) পড়ে তবে এটি পুনরুদ্ধার হয়।"
জেরুউকি

8
আমি দেখতে পাচ্ছি না কেন চেষ্টা করবে: বাদে: দরকারী হবে।
typicalHog

53

যারা উইন্ডোতে আছেন এবং একটি কার্যকরী উত্তর খুঁজে পেতে লড়াই করছেন তাদের এখানে আমার: পাইপপুট

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

4
এই সমাধানটিতে একটি সমস্যা রয়েছে (বিকল্পগুলি সম্পর্কে নিশ্চিত নয়): কীটি কার্যকর হওয়ার জন্য কোনও কনসোল উইন্ডোতে টিপতে হবে না। কোনও স্ক্রিপ্ট থাকার কথা ভাবুন যা ESC চাপ না দেওয়া পর্যন্ত কিছু কাজ করে তবে আপনি এটি অন্য প্রোগ্রামে চাপুন।
মার্কাস ফন ব্রডি

4
@ মারকুসভনড্রোডি আমার ধারণা, উইন 32 গুই এর সমাধানের জন্য যথেষ্ট হবে, আমি আমার উত্তরটি এমনভাবে সম্পাদনা করেছি যাতে এটি সম্ভবত উইন্ডোজ ব্যবহারকারীদের কাছে সমাধান করতে পারে।
মিত্রেক

@ মিত্রেক আমি এটি চেষ্টা করেছি, তবে আমার কোডটি আরও কার্যকর করা বন্ধ করে এবং এখানে আটকে আছে। এটি ইনপুট () এর মতো কাজ করে। আমার কোডটি সেলেনিয়াম, ফায়ারফক্সে নির্বাহ করছে, তবে এই ক্রমটি আসার সাথে সাথে এর আর কোনও পদক্ষেপ নেই।
লক্ষ্মী নারায়ণন

4
স্বীকৃত উত্তর হওয়া উচিত ছিল, কারণ এটি লিনাক্স এবং উইন্ডো উভয় ক্ষেত্রেই কাজ করে
আকাশ কর্ণাতক

31

যেমন ওপি কাঁচা ইনপুট সম্পর্কে উল্লেখ করেছে - তার অর্থ তিনি ক্লাইট সমাধান চান। লিনাক্স: আপনি যা চান তা অভিশাপ (উইন্ডোজ পিডিক্রুস)। অভিশাপ, ক্লাইফ সফ্টওয়্যারটির জন্য একটি গ্রাফিকাল এপিআই, আপনি মূল ইভেন্টগুলি সনাক্ত করার চেয়ে আরও বেশি কিছু অর্জন করতে পারেন।

নতুন লাইনটি চাপ না দেওয়া পর্যন্ত এই কোডগুলি কীগুলি সনাক্ত করবে।

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এটি করেন তবে এটি প্রতি সেকেন্ডে মিলিয়ন ব্যতিক্রম উত্পন্ন করবে না।
জোহানেস হফ

29

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 পুরো ওএস থেকে কী-টিপস পড়বে।
  • keyboard লিনাক্সের মূল প্রয়োজন

11
কীবোর্ড মডিউলটি ব্যবহারের সবচেয়ে বড় NEGATIVE হ'ল এটি আপনি রুট ব্যবহারকারী হিসাবে চালান requirement এটি আমার কোডে মডিউলটি ভারবোটেন করে। কী টিপে চাপ দেওয়া হয়েছে কিনা তা জরিপ করার জন্য মূল অধিকারগুলির প্রয়োজন হয় না। আমি ডকটি পড়েছি এবং বুঝতে পেরেছি কেন মডিউলটিতে সীমাবদ্ধতাটি বাইরে চলে যায় তবে অন্যদিকে তাকান যদি আপনার প্রয়োজনীয় সমস্ত কীটি পোল করা হয় ...
মুমান

খুব সহায়ক তথ্য শেয়ার করা হয়েছে, স্যার! আমি জানতে চেয়েছিলাম যে আমি keyboard.wait()1 টিরও বেশি কী অপেক্ষা করতে ব্যবহার করতে পারি , এবং যদি
সেগুলির

@ প্রীতকারণসিংহ wait()এই কার্যকারিতাটি দেয় না। keyboard.read_key()কিছুক্ষণ লুপে প্যাক করা শর্তের সাথে আপনাকে ব্যবহার করতে হবে । পদ্ধতি # 1 দেখুন
কালো থান্ডার

ধন্যবাদ স্যার! আপনি কী suppressকীওয়ার্ড ব্যবহার করবেন keyboard.read_key(), কখন এটি ব্যবহার করবেন এবং কখন করবেন না সে সম্পর্কে কিছুটা আলোকপাত করতে চান ....
প্রীতকরন সিং

@ প্রীতকারণসিংহ আমার কাছে দাবী করার যুক্তি সম্পর্কে আমার কাছে কিন্তু পর্যাপ্ত তথ্য নেই
ব্ল্যাক থান্ডার

15

জন্য উইন্ডোজ আপনি ব্যবহার করতে পারে msvcrtএই রকম:

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

8
এমএসভিসিআরটি একটি উইন্ডোজ-শুধুমাত্র মডিউল।
ডুনাটোটাটোস

4
আমি আসলে এখন পিনপুট ব্যবহার করি, এটি আরও ভাল উত্তর হতে পারে
বেনজি

নোট করুন যে ওএস এক্সে কাজ করার জন্য পিনপুট (লিনাক্স সম্পর্কে জানেন না) কাজ করার জন্য রুট হিসাবে চালাতে হবে। এটি কিছু লোকের জন্য একটি অ-স্টার্টার হতে পারে।
গ্যাবে ওয়েইস

আমি শপথ করতে পারতাম প্রশ্নটি 'ক্রস প্ল্যাটফর্ম' বা 'লিনাক্স' এর জন্য ...
হারুন মান

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

যদিও জিনিসটি এখানে, আমি ম্যাকস ব্যবহার করছি এবং উভয় পাইপপুট এবং কীবোর্ড পৃথকভাবে ইনস্টল করেছি এবং প্রোগ্রামটি কোনও ত্রুটি ছাড়াই চলে তবে কেবল (পাইথন শেলের উপর) বিশেষ কীগুলি সনাক্ত করতে পারে। আলফানিউমেরিক কীগুলি সনাক্ত করা যায় নি এবং বিপরীতভাবে, বিবেচনা করা হয় যেন আমি শেলটিতে কোড লিখছি। আপনি কি জানেন সমস্যাটি কি হতে পারে?
ডারিও ডেনিজ এরগান

একই কোডটি শেলটিতে আমার জন্য কাজ করেছিল। দয়া করে এটি পরীক্ষা করুন। কীবোর্ড প্যাকেজটির এই কোডটির প্রয়োজন নেই।
মণিভানান মুরুগাভেল

4
কীবোর্ড lib এর মূল প্রয়োজন হওয়ায় এটি লিনাক্সে যাওয়ার উপায়।
ডেভিড

4
এই সমাধানটি সমস্ত কীস্ট্রোক সনাক্ত করবে ; এছাড়াও একটি ভিন্ন টার্মিনাল উইন্ডোতে ঘটছে। দুর্ভাগ্যক্রমে, এটি তার সম্ভাব্য ব্যবহারের ক্ষেত্রে মারাত্মকভাবে সীমাবদ্ধ করে।
সার্জ Stroobandt

6

উইন্ডো পেতে পাইগেম ব্যবহার করুন এবং তারপরে আপনি মূল ইভেন্টগুলি পেতে পারেন।

চিঠির জন্য 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

সুতরাং আমি এই .. গেম অফ গেম তৈরি করেছি .. এই পোস্টের উপর ভিত্তি করে (এমএসভিসিআর লাইব্রেরি এবং পাইথন ৩.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

আপনি যদি পোরগ্রামের পুরো উত্স কোডটি চান তবে এটি দেখতে বা ডাউনলোড করতে পারেন এখান থেকে:

সিক্রেট কী গেম (গিটহাব)

(দ্রষ্টব্য: গোপন কিপ্রেস হ'ল: Ctrl+ F12)

আমি আশা করি আপনি উদাহরণ হিসাবে পরিবেশন করতে পারেন এবং যারা এই তথ্যের সাথে পরামর্শ করতে আসে তাদের জন্য সহায়তা করতে পারেন।



1
key = cv2.waitKey(1)

এটি ওপেনসিভি প্যাকেজ থেকে এসেছে। এটি অপেক্ষা না করে একটি কীপ্রেস সনাক্ত করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.