在Python中的关键听众?

有没有一种方式来执行python中的关键监听器没有像pygame这样庞大的模块?

一个例子是,当我按下一个键将打印到控制台

一键被按下了!

它也应该听方向键/空格键/ shift键。

不幸的是,这并不容易。 如果您正在尝试制作某种文本用户界面,则可能需要查看curses 。 如果你想像terminal一样显示你想要的东西,但是需要这样的input,那么你将不得不使用termios ,不幸的是,这在Python中看起来很糟糕。 不幸的是,这些选项都不是那么简单。 另外,它们不能在Windows下工作。 如果您需要它们在Windows下工作,则必须使用PDCurses作为curses或pywin32的替代,而不是termios


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

 #!/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() 

以下是在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) 

有一种方法可以在python中执行关键的监听器。 这个function可以通过pynput获得 。

命令行:

 > pip install pynput 

Python代码:

 from pynput import ket,listener # your code here 

我正在寻找一个没有窗口焦点的简单解决scheme。 Jayk的答案,pynput,对我来说是完美的。 这里是我如何使用它的例子。

 from pynput import keyboard def on_press(key): try: k = key.char # single-char keys except: k = key.name # other keys if key == keyboard.Key.esc: return False # stop listener if k in ['1', '2', 'left', 'right']: # keys interested # self.keys.append(k) # store it in global-like variable print('Key pressed: ' + k) return False # remove this if want more keys lis = keyboard.Listener(on_press=on_press) lis.start() # start to listen on a separate thread lis.join() # no this if main thread is polling self.keys 

键盘

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

所有键盘上的全局事件挂钩(不pipe焦点如何都可以捕获键)。 监听并发送键盘事件。 与Windows和Linux(需要sudo),与实验OS X支持(谢谢@ glitchassassin!)。 纯Python,没有C模块被编译。 零依赖。 琐碎的安装和部署,只需复制文件。 Python 2和3.复杂的热键支持(例如,Ctrl + Shift + M,Ctrl +空格),可控超时。 包括高级API(例如logging和播放,add_abbreviation)。 地图键,因为他们实际上是在你的布局,全面的国际化支持(例如Ctrl +ç)。 在单独的线程中自动捕获的事件不会阻塞主程序。 testing和logging。 不会打破重音死锁(我在看你,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()