обнаружить нажатие клавиши в python?

<p>я делаю программу типа секундомера на python, и я хотел бы знать, как определить, нажата ли клавиша (например, p для паузы и s для остановки), и я не хотел бы, чтобы это было что-то вроде raw\_input, который ждет ввод пользователя перед продолжением исполнения. кто-нибудь знает, как сделать это во время цикла?</p><p>кроме того, я хотел бы сделать это кроссплатформенным, но если это невозможно, то моя главная цель разработки - linux</p>

<p>в python есть модуль <a href="https://pypi.python.org/pypi/keyboard"><strong>keyboard</strong></a> со многими функциями. установите его, возможно, с помощью этой команды: </p><pre><code>pip3 install keyboard </code></pre><p>тогда используйте это в коде как:</p><pre><code>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 else: pass except: break # if user pressed a key other than the given key the loop will break </code></pre>

<p>в качестве op упоминается о raw\_input - это означает, что он хочет получить решение для кли ........ linux: <a href="http://docs.python.org/2/library/curses.html">curses</a> это то, что вы хотите (windows pdcurses). curses, это графический api для cli software, вы можете достичь большего, чем просто обнаруживать ключевые события.</p><p>этот код будет обнаруживать клавиши до тех пор, пока не будет нажата новая строка.</p><pre><code>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) </code></pre>

<p>для<strong> windows </strong>вы можете использовать <code>msvcrt</code> следующим образом:</p><pre><code> import msvcrt while true: if msvcrt.kbhit(): key = msvcrt.getch() print(key) # just to show the result </code></pre>

<p>для тех, кто на окнах и пытался найти рабочий ответ, вот мой: <a href="https://pythonhosted.org/pynput/">pynput</a> </p><pre><code>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() </code></pre><p>приведенная выше функция будет печатать любую нажатую клавишу, а также запускать действие при отпускании клавиши «esc». документация для клавиатуры находится <a href="https://pythonhosted.org/pynput/keyboard.html">здесь</a> для более разнообразного использования.</p>

<p>используйте pygame, чтобы иметь окно, а затем вы можете получить ключевые события.</p><p><strong> для письма <code>p</code>: </strong></p><pre><code>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: #do what you want to here pass if event.type == pygame.locals.quit: pygame.quit() sys.exit() </code></pre>

<p>используйте этот код, чтобы найти, какая клавиша нажата</p><pre><code>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() </code></pre>

<p>я бы предложил вам использовать pygame и добавить дескриптор события.</p><p> <a href="http://www.pygame.org/docs/ref/event.html">http://www.pygame.org/docs/ref/event.html</a> </p>

<p>так что я сделал это .. вид игры .. на основе этого поста (используя библиотеку msvcr и python 3.7).</p><p>ниже приводится «основная функция» игры, которая заключается в обнаружении нажатых клавиш:</p><pre><code># 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 </code></pre><p>если вам нужен полный исходный код программы, вы можете посмотреть его или скачать здесь:</p><p> <a href="https://github.com/ferd656/the\_secret\_key\_game/">секретный ключ игры (github)</a> </p><p>(примечание: секретное нажатие клавиши: ctrl + f12)</p><p>я надеюсь, что вы можете служить примером и помощью для тех, кто приходит, чтобы ознакомиться с этой информацией.</p><p>привет!</p>

<p>key = cv2.waitkey (1)</p><p>это из пакета opencv . он обнаруживает нажатие клавиши без ожидания.</p>