繁体   English   中英

Python:我该如何编写键盘事件?

[英]Python: how would I write a keyevent?

简而言之,我希望我的代码每次按下一个键时都调用一个事件,例如OnKeyPress(“ Keyname”)之类的东西。 我不想使用tkinter。

我有一个Update方法,它在父类中每秒被调用20次,而我有几个子类都具有该函数。 我想在其中的一些按钮上使用按键事件来使我正在移动的机器人零件运动(例如:当我按下向上箭头时,机器人将移动前言)tkinter并不是为此而设计的,它的更多功能是在屏幕上绘制内容,我想使代码更高效。 我也想拥有自己的,然后使用预制的,这样我才能更好地了解它的工作原理。

我敦促您重新考虑不使用tkinter。 忽略GUI内容,它具有经过测试的跨平台异步事件循环系统,该系统可以处理计划(定时)事件以及按键和释放事件。 并且它是用C编写的,并随着平台的变化而更新。 (请参阅有关平台更改的配方@Ty的注释。)您将发现很难在Python中重现相同的功能。

使用将以

import tkinter
root = tkinter.Tk()
root.withdraw()  # make the window invisible

此后,可以忽略GUI内容,而仅使用root.bind(键事件,函数)和root.after(毫秒,函数,* args)。 (与此同时,将来仍然可以使用图形与机器人进行交互。)

给定现有的move_forward和stop_move函数,以下是在按向上箭头的同时使机器人移动的方法。

root.bind('<KeyPress-Up>', move_forward)
root.bind('<keyRelease-Up>' stop_move)

关于异步(非阻塞)的重要性:我假设您通过在每次更新之间调用time.sleep(.05)每秒调用一次更新函数20次。 这是一个阻塞调用,在此期间您的代码被冻结。 它不能做任何事情,也不能响应事件。

假设您为机器人开发了两个或更多动画:说一个代表手臂,一个代表头部(或任何适合您的机器人的动画)。 每个命令都由一系列时间命令组成,这些命令由root.after调用实现。 现在假设您要并行运行两个或更多动画。 假设每个程序只占用一小部分CPU时间,那么使用tkinter会很麻烦,因为每个程序都将异步运行并且不会阻止程序执行其他操作。 使用阻塞事件系统,您必须为每个所需的组合编写一个新的动画。

这应该工作

class _GetchUnix:
    def init(self):
        import tty, sys
    def call(self):
        import sys, tty, termios
        fd = sys.stdin.fileno()
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(sys.stdin.fileno())
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch
class _GetchWindows:
    def init(self):
        import msvcrt
    def call(self):
        import msvcrt
        return msvcrt.getch()
class _Getch:
    def init(self):
        try:
            self.impl = _GetchWindows()
        except ImportError:
            self.impl = _GetchUnix()

def __call__(self): return self.impl() getch = _Getch() while True: if getch.impl(): print getch.impl()

所需的一切都由while循环决定。 然后,无论何时调用getch.impl()它都会等待输入,但是如果没有输入,它将继续运行。 这就是为什么我使用while循环

免责声明
这不是我的代码,请签出:
http://code.activestate.com/recipes/134892/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM