没有GUI的Python键盘事件(非阻塞)

时间:2016-08-03 21:47:37

标签: python windows python-3.x

我正在尝试找到一种在Python中获取KeyDown和KeyUp事件的方法。使用Pygame,可以使用pygame.KEYDOWNpygame.KEYUP轻松完成,但我试图找到一种不使用GUI的方法。

理想情况下,我希望能够定义一个函数isKeyDown(key),如果True当前被按下,则会返回key,如果是False则返回while True: if not isKeyDown("a"): #If 'a' isn't currently being pressed print ("You are not pressing 'a'") elif isKeyDown("a"): #If 'a' is being held down when this is run print ("You are pressing 'a'") print ("This is the end of this program") break 不是,但无论如何,它将继续使用代码(它将是非阻塞的)。例如:

msvcrt.getch()

我已尝试while,但这有两个问题:

1)它会在程序被按下之前停止程序,

2)它并没有真正告诉你键是否被按下;如果当时按下键,它只会返回。这有时可能会重合,因为Windows会在按下时重复按键,但是当msvcrt.kbhit()循环以最大速度运行时,不太可能发生这种情况。

我还使用了1,但如果msvcrt.getch()按下任何键并且没有被msvcrt.getch()读取,它会将自身设置为curses,因此仍会遇到问题isKeyDown()的{​​{1}}并没有真正返回当前是否正在按下某个键。

我使用的是Windows,因此许多人用来回答类似问题的const OptionItem = (props) => ( <div> {props.children} </div> ); const Options = (props) => { const children = React.Children.map(props.children, (child) => { if (React.isValidElement(child)) { return child; } else { return <OptionItem>{child}</OptionItem > } }); return ( <div className="options"> {children} </div> ); }; Options.propTypes = { children: React.PropTypes.node } ReactDOM.render( <Options> {['First', 'Second', 'Third', 'Fourth']} </Options > , document.getElementById('app') );模块无法使用。

有没有办法在没有GUI的Windows中定义这样的<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id="app"></div>函数,最好只使用内置模块?如果使用内置的Python模块无法实现这一点,那么第三方模块就可以了,只要他们不需要GUI。

即使使用Pygame或Tkinter也可以,只要关闭他们的GUI就可以了。

如果无法做到这一点,请告诉我原因,所以我可以停止寻找解决方案(过去几天我一直试图做其他事情)。

我在64位Windows 10笔记本电脑上使用Python 3.5.2。

1 个答案:

答案 0 :(得分:0)

看起来你想要做的就是获得pyhook。我认为这取决于pywin32库。

基本上你想要做的是寻找创建一个键盘记录器。这将为您提供非阻塞键盘事件。当然,您可能希望使用win32 api确保按下该键时,您的窗口是焦点,如果这对您很重要。

我没有可访问的Windows框,或者我可以为您提供更多代码示例,但这至少应该指向正确的方向。