python中的关键监听器?

时间:2012-08-12 01:20:35

标签: python keylistener

有没有办法在python中执行关键监听器而没有像pygame那样庞大的膨胀模块?

一个例子是,当我按下 a 键时,它会打印到控制台

  

按下了一把钥匙!

它还应该听取箭头键/空格键/ shift键。

6 个答案:

答案 0 :(得分:21)

遗憾的是,这并不容易。如果您尝试制作某种文本用户界面,可能需要查看curses。如果你想在终端中显示你通常会想要的东西,但是想要这样的输入,那么你将不得不使用termios,遗憾的是,它似乎在Python中记录不足。不幸的是,这些选项都不是那么简单。此外,它们不能在Windows下工作;如果您需要它们在Windows下工作,则必须使用PDCurses替代cursespywin32而不是termios


我能够让这个工作得体。它打印出您键入的键的十六进制表示。正如我在你的问题的评论中所说,箭头是棘手的;我想你会同意的。

#!/usr/bin/env python
import sys
import termios
import contextlib


@contextlib.contextmanager
def raw_mode(file):
    old_attrs = termios.tcgetattr(file.fileno())
    new_attrs = old_attrs[:]
    new_attrs[3] = new_attrs[3] & ~(termios.ECHO | termios.ICANON)
    try:
        termios.tcsetattr(file.fileno(), termios.TCSADRAIN, new_attrs)
        yield
    finally:
        termios.tcsetattr(file.fileno(), termios.TCSADRAIN, old_attrs)


def main():
    print 'exit with ^C or ^D'
    with raw_mode(sys.stdin):
        try:
            while True:
                ch = sys.stdin.read(1)
                if not ch or ch == chr(4):
                    break
                print '%02x' % ord(ch),
        except (KeyboardInterrupt, EOFError):
            pass


if __name__ == '__main__':
    main()

答案 1 :(得分:13)

以下是如何在Windows上执行此操作:

"""

    Display series of numbers in infinite loop
    Listen to key "s" to stop
    Only works on Windows because listening to keys
    is platform dependent

"""

# msvcrt is a windows specific native module
import msvcrt
import time

# asks whether a key has been acquired
def kbfunc():
    #this is boolean for whether the keyboard has bene hit
    x = msvcrt.kbhit()
    if x:
        #getch acquires the character encoded in binary ASCII
        ret = msvcrt.getch()
    else:
        ret = False
    return ret

#begin the counter
number = 1

#infinite loop
while True:

    #acquire the keyboard hit if exists
    x = kbfunc() 

    #if we got a keyboard hit
    if x != False and x.decode() == 's':
        #we got the key!
        #because x is a binary, we need to decode to string
        #use the decode() which is part of the binary object
        #by default, decodes via utf8
        #concatenation auto adds a space in between
        print ("STOPPING, KEY:", x.decode())
        #break loop
        break
    else:
        #prints the number
        print (number)
        #increment, there's no ++ in python
        number += 1
        #wait half a second
        time.sleep(0.5)

答案 2 :(得分:9)

有一种方法可以在python中执行关键监听器。此功能可通过pynput获得。

命令行:

> pip install pynput

Python代码:

from pynput import ket,listener
# your code here

答案 3 :(得分:7)

我正在寻找一个没有窗口焦点的简单解决方案。 Jayk的答案,pynput,对我来说非常适合。以下是我如何使用它的示例。

let companyId = "";
let accountId = "";    
let myToken = "fakeToken1234";
    $.ajax({
          type: "GET",
          url: `https://api.callrail.com/v2/a/${accountId}/calls.json?company_id=${companyId}`,
          headers: {"Authorization": `Token token="${myToken}"`},
          dataType: 'json'
    });

答案 4 :(得分:7)

键盘

  

使用这个小型Python库完全控制键盘。挂钩全局事件,注册热键,模拟按键等等。

     

所有键盘上的全局事件挂钩(无论焦点如何都捕获键)。   收听并发送键盘事件。   适用于Windows和Linux(需要sudo),支持实验性OS X(感谢@glitchassassin!)。   纯Python,没有要编译的C模块。   零依赖。安装和部署很简单,只需复制文件即可。   Python 2和3。   具有可控超时的复杂热键支持(例如Ctrl + Shift + M,Ctrl + Space)。   包括高级API(例如记录和播放,add_abbreviation)。   映射键实际上位于您的布局中,具有完全国际化支持(例如Ctrl +ç)。   事件自动在单独的线程中捕获,不会阻塞主程序。   经过测试和记录。   不打破重音死键(我在看你,pyHook)。   通过项目鼠标(pip安装鼠标)提供鼠标支持。

来自README.md

import keyboard

keyboard.press_and_release('shift+s, space')

keyboard.write('The quick brown fox jumps over the lazy dog.')

# Press PAGE UP then PAGE DOWN to type "foobar".
keyboard.add_hotkey('page up, page down', lambda: keyboard.write('foobar'))

# Blocks until you press esc.
keyboard.wait('esc')

# Record events until 'esc' is pressed.
recorded = keyboard.record(until='esc')
# Then replay back at three times the speed.
keyboard.play(recorded, speed_factor=3)

# Type @@ then press space to replace with abbreviation.
keyboard.add_abbreviation('@@', 'my.long.email@example.com')
# Block forever.
keyboard.wait()

答案 5 :(得分:1)

虽然我喜欢使用键盘模块来捕捉键盘事件,但我不喜欢它的record()函数,因为它返回一个类似[KeyboardEvent("A"), KeyboardEvent("~")]的数组,我觉得很难读。因此,为了记录键盘事件,我喜欢同时使用键盘模块和线程模块,如下所示:

import keyboard
import string
from threading import *


# I can't find a complete list of keyboard keys, so this will have to do:
keys = list(string.ascii_lowercase)
"""
Optional code(extra keys):

keys.append("space_bar")
keys.append("backspace")
keys.append("shift")
keys.append("esc")
"""
def listen(key):
    while True:
        keyboard.wait(key)
        print("[+] Pressed",key)
threads = [Thread(target=listen, kwargs={"key":key}) for key in keys]
for thread in threads:
    thread.start()