带时间戳的多次击键

时间:2015-01-07 16:43:25

标签: python tkinter

所以,我的项目团队正在尝试在Python中编写一个程序,打开一个窗口并显示当你按下键盘上的8个键中的1个时,这个程序会记录它被按下多长时间并制作一个表和输出当窗户关闭时。

问题是,因为你使用事件处理程序,当你或者你没有按键时调用一个函数,如果你按下多个键,因为Python是一种解释语言,它不能有两个函数调用同时。我们如何不断跟踪8个键是否同时被记录?

由于

编辑:使用Tkinter进行GUI

1 个答案:

答案 0 :(得分:0)

大多数工具包为按键和按键释放提供不同的事件。因此,您需要做的就是为印刷机和发布事件设置单独的处理程序。在按下时,使用键和按下的时间更新字典,列表,数据库或其他内容。在发布时,撤消该操作。

例如,在python 2.x上的Tkinter中,它可能看起来像这样(虽然这个例子只是跟踪按下键的时间,而不是按下它的时间长度)

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent)

        self.active = {}
        self.label = tk.Label(self, width=50)
        self.label.pack(fill="both", expand=True, padx=10, pady=10)

        for key in ("a","s","d","f", "h","j", "k", "l"):
            self.active[key] = None
            self.label.bind("<KeyPress-%s>" % key, self.on_press)
            self.label.bind("<KeyRelease-%s>" % key, self.on_release)

        self.update_label()
        self.label.focus_set()

    def update_label(self):
        chars = [char for char in self.active.keys() if self.active[char] is not None]
        self.label.configure(text="active keys: " + ",".join(sorted(chars)))

    def on_press(self, event):
        self.active[event.keysym] = event.time
        self.update_label()

    def on_release(self, event):
        self.active[event.keysym] = None
        self.update_label()

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