在python中输入WASD

时间:2015-02-03 18:21:28

标签: python tkinter keyboard

在python中,我该如何接收键盘输入。我很清楚使用input("...")的控制台输入,但我更关心在控制台窗口未激活时接收键盘输入。例如,如果我创建了一个Tkinter屏幕的实例,我怎么能检查是否按下了“w”。然后,如果语句返回true,我可以相应地移动一个对象。

1 个答案:

答案 0 :(得分:4)

使用像tkinter这样的GUI工具包执行此操作的方法是创建绑定。绑定说"当这个小部件有焦点并且用户按下键X时,调用此函数"。

有很多方法可以实现这一目标。例如,您可以为每个角色创建不同的绑定。或者,您可以创建一个针对任何角色触发的单个绑定。使用这些绑定,您可以让它们各自调用一个唯一的函数,或者您可以让所有绑定调用单个函数。最后,您可以将绑定放在单个窗口小部件上,也可以将绑定放在所有窗口小部件上。这完全取决于你想要完成的事情。

在一个只想要检测四个键的简单情况下,调用单个函数的四个绑定(每个键一个)可能是最有意义的。例如,在python 2.x中,它看起来像这样:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent, width=400,  height=400)

        self.label = tk.Label(self, text="last key pressed:  ", width=20)
        self.label.pack(fill="both", padx=100, pady=100)

        self.label.bind("<w>", self.on_wasd)
        self.label.bind("<a>", self.on_wasd)
        self.label.bind("<s>", self.on_wasd)
        self.label.bind("<d>", self.on_wasd)

        # give keyboard focus to the label by default, and whenever
        # the user clicks on it
        self.label.focus_set()
        self.label.bind("<1>", lambda event: self.label.focus_set())

    def on_wasd(self, event):
        self.label.configure(text="last key pressed: " + event.keysym);


if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()