2015-01-07 41 views
-1

因此,我的項目團隊正在嘗試在Python中編寫一個程序,該程序打開一個窗口並顯示當您按下鍵盤上的8個鍵中的1個時,該程序會記錄按下多長時間一個表格並在窗口關閉時輸出。帶時間戳的多次擊鍵

問題是,既然您使用的事件處理程序在您正在或未按下某個鍵時調用某個函數,如果您按多個鍵,由於Python是一種解釋型語言,因此它不能具有兩個函數在同一時間呼叫。我們如何不斷跟蹤8個鍵是否被同時記錄?

感謝

編輯:使用Tkinter的GUI的

+0

半認真的回答:由於宇宙的相對論性質,沒有「同時」這樣的東西。如果你的程序記錄了一個鍵在另一個鍵之前被按下了一個納秒,當你觀察它們在同一時間發生的時候,它是否真的會產生很大的不同? – Kevin

+0

...和btw:這個問題與你使用的GUI框架高度相關。不知道它是哪一個,沒有人可以幫助你。 – tamasgal

+0

在大多數實現中,按鍵事件進入一個隊列,根據收到的時間標記時間戳,並且事件循環一次處理一個事件。對「同時」進行兩個函數調用的限制(或者,正如@凱文正確地指出,宇宙中的任何兩個事件同時發生)與語言是否被解釋無關。如果您對關鍵事件響應進行了一些研究,則會發現很多解決方案(Python和非Python),這些解決方案對於您的應用程序而言可以很好地工作。 – jez

回答

0

大多數工具包給出了按鍵和鍵釋放不同的事件。因此,你所需要做的就是爲新聞和發佈事件設置單獨的處理程序。在按下時,用鍵和時間來更新字典,列表,數據庫或其他內容。在發佈時,撤銷該操作。

例如,在Tkinter的關於Python 2.x的可能是這個樣子(雖然這個例子僅僅是跟蹤時被按下的鍵,不是被按下多久的)

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()