Опрос клавиатуры (обнаруживают нажатие клавиши) в Python

60
задан alexis 21 December 2015 в 13:06
поделиться

6 ответов

Стандартный подход должен использовать выбор модуль.

Однако это не работает над Windows. Для этого можно использовать опрос клавиатуры msvcrt модуля.

Часто, это сделано с несколькими потоками - один для каждого устройства, "наблюдаемый" плюс фоновые процессы, которые, возможно, должны были бы быть прерваны устройством.

31
ответ дан mmoya 24 November 2019 в 17:47
поделиться

Хорошо, начиная с моей попытки отправить мое решение в неудавшемся комментарии, вот то, что я пытался сказать. Я мог сделать точно, что я хотел от собственного Python (в Windows, не где-либо еще хотя) со следующим кодом:

import msvcrt 

def kbfunc(): 
   x = msvcrt.kbhit()
   if x: 
      ret = ord(msvcrt.getch()) 
   else: 
      ret = 0 
   return ret
15
ответ дан K. Brafford 24 November 2019 в 17:47
поделиться

Вы могли бы посмотреть на то, как pygame обрабатывает это для кражи некоторых идей.

5
ответ дан Rizwan Kassim 24 November 2019 в 17:47
поделиться

Из комментариев:

import msvcrt # built-in module

def kbfunc():
    return ord(msvcrt.getch()) if msvcrt.kbhit() else 0
<час>

спасибо за справку. Я закончил тем, что писал DLL C под названием PyKeyboardAccess.dll и получил доступ к crt conio функции, экспортировав эту стандартную программу:

#include <conio.h>

int kb_inkey () {
   int rc;
   int key;

   key = _kbhit();

   if (key == 0) {
      rc = 0;
   } else {
      rc = _getch();
   }

   return rc;
}

И я получаю доступ к нему в Python с помощью ctypes модуля (встроенный в python 2.5):

import ctypes
import time

#
# first, load the DLL
#


try:
    kblib = ctypes.CDLL("PyKeyboardAccess.dll")
except:
    raise ("Error Loading PyKeyboardAccess.dll")


#
# now, find our function
#

try:
    kbfunc = kblib.kb_inkey
except:
    raise ("Could not find the kb_inkey function in the dll!")


#
# Ok, now let's demo the capability
#

while 1:
    x = kbfunc()

    if x != 0:
        print "Got key: %d" % x
    else:
        time.sleep(.01)
5
ответ дан jfs 24 November 2019 в 17:47
поделиться

import sys
import select

def heardEnter():
    i,o,e = select.select([sys.stdin],[],[],0.0001)
    for s in i:
        if s == sys.stdin:
            input = sys.stdin.readline()
            return True
    return False
16
ответ дан 24 November 2019 в 17:47
поделиться

Решение с использованием модуля curses. Печать числового значения, соответствующего каждой нажатой клавише:

import curses

def main(stdscr):
    # do not wait for input when calling getch
    stdscr.nodelay(1)
    while True:
        # get keyboard input, returns -1 if none available
        c = stdscr.getch()
        if c != -1:
            # print numeric value
            stdscr.addstr(str(c) + ' ')
            stdscr.refresh()
            # return curser to start position
            stdscr.move(0, 0)

if __name__ == '__main__':
    curses.wrapper(main)
16
ответ дан 24 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: