计算Python中一系列关键事件之间的时间间隔

计算Python中一系列关键事件之间的时间间隔,python,events,tkinter,keyboard-events,Python,Events,Tkinter,Keyboard Events,作为我自学项目的一部分,我决定用Python创建一个应用程序,它可以监听某些keyevents,并找到键入单词所需的时间。经过12个多小时的直接调试和循环/逻辑实验,我所能做的就是: import Tkinter import time KeyWatch = Tkinter.Tk() WordBoxLegend = Tkinter.Label(KeyWatch, text="Type the required word") WordBoxLegend.pack(side=Tkinter.LE

作为我自学项目的一部分,我决定用Python创建一个应用程序,它可以监听某些
keyevents
,并找到键入单词所需的时间。经过12个多小时的直接调试和循环/逻辑实验,我所能做的就是:

import Tkinter
import time

KeyWatch = Tkinter.Tk()

WordBoxLegend = Tkinter.Label(KeyWatch, text="Type the required word")
WordBoxLegend.pack(side=Tkinter.LEFT)

WordBox = Tkinter.Entry(KeyWatch)
WordBox.pack(side=Tkinter.LEFT)

TextBoxLegend = Tkinter.Label(KeyWatch, text="Type the same to calculate the time")
TextBoxLegend.pack(side=Tkinter.LEFT)

TextBox = Tkinter.Entry(KeyWatch) 
TextBox.pack(side=Tkinter.RIGHT)

WordBox.focus()

def pressed(keyevent):
    WordRequire = WordBox.get()
    LetterList = tuple(WordRequire)
    start = time.time()
    LastLetter = str(LetterList[-1])
    print len(LetterList())
    print LetterList[len(LetterList)]
    if keyevent.char in LetterList:
        for x in range(0, len(LetterList)):
            if LetterList[x] != LastLetter:
                print LetterList[x]
                TextBox.unbind(str(LetterList[x]))
                TextBox.bind(str(LetterList[x+1]))
            elif str(LetterList[x]) == LastLetter and x == len(LetterList):
                stop = time.time()
                totaltime = stop - start
                print LetterList[x]
                print totaltime
                break
                TextBox.unbind(LetterList[x])
            else:
                TextBox.unbind(str(LetterList))     
    else:   
        print "Type only the letters from" +str(LetterList)

KeyWatch.mainloop()
TextBox.bind("<Key>", pressed)
导入Tkinter
导入时间
KeyWatch=Tkinter.Tk()
WordBoxLegend=Tkinter.Label(KeyWatch,text=“键入所需单词”)
WordBoxLegend.pack(侧面=Tkinter.LEFT)
WordBox=Tkinter.Entry(KeyWatch)
WordBox.pack(侧面=Tkinter.LEFT)
TextBoxLegend=Tkinter.Label(KeyWatch,text=“键入相同内容以计算时间”)
TextBoxLegend.pack(侧面=Tkinter.LEFT)
TextBox=Tkinter.Entry(KeyWatch)
TextBox.pack(side=Tkinter.RIGHT)
WordBox.focus()
按下def(按键事件):
WordRequire=WordBox.get()
字母列表=元组(WordRequire)
开始=时间。时间()
LastLetter=str(字母列表[-1])
打印长度(字母列表())
打印信函列表[len(信函列表)]
如果字母列表中有keyevent.char:
对于范围(0,长度(字母列表))内的x:
如果字母列表[x]!=最后一封信:
打印信函列表[x]
TextBox.unbind(str(LetterList[x]))
TextBox.bind(str(字母列表[x+1]))
elif str(字母列表[x])==最后一个字母,x==len(字母列表):
停止=时间。时间()
总时间=停止-启动
打印信函列表[x]
打印总时间
打破
TextBox.unbind(字母列表[x])
其他:
文本框。解除绑定(str(字母列表))
其他:
打印“仅键入来自”+str的字母(字母列表)
KeyWatch.mainloop()
TextBox.bind(“,按下)

在绑定键并将其传递给按下的
方法之后,我不确定如何解除该键的绑定并绑定元组中的下一个值

预期结果

如果我输入单词“湮没”,程序应该告诉我从
keyevent
“O”到
keyevent
“n”需要多长时间

Tkinter中事件的预期结果是什么?

这很有趣

我用pep8重写了你的代码

为便于阅读,对变量名进行了调整

在定义开始时间时,存在一些逻辑错误

假设每次按下一个键时,都会调用
pressed()
。还有一个隐藏的问题是如何检测按键。您的代码有:

word_repeat_box.bind("<Key>", pressed)

这可能在没有全局变量的情况下完成,也可能通过递归调用完成,但我将留给您来解决

如果您更接近pep8,您的代码将更容易理解。最明显的问题是变量名看起来像类。只是看看PEP 0008:)注意到了什么!当按下错误的键时,为什么要解除键绑定而不是什么都不做?主要问题之一是它进入无限循环,解除键绑定会阻止它。不过,在上面的代码中,解除绑定不起作用。哇:)谢谢Dan。。。今天学到了很多。当然!值得注意的是,我没有检查每个字符是否与原始单词中的下一个字母匹配(在我的测试用例中,doom==demise),也没有检查是否有人退格到第一个字符(然后重新启动启动启动计时器),但我想你可以看到足够多的东西如何工作,以添加其他逻辑。是的,我发现了这一点。我将尝试添加更多的逻辑并使用它:)
import Tkinter
import time

start = None
stop = None

key_watcher = Tkinter.Tk()

word_entry_label = Tkinter.Label(key_watcher, text="Type the required word")
word_entry_label.pack(side=Tkinter.LEFT)

word_entry_box = Tkinter.Entry(key_watcher)
word_entry_box.pack(side=Tkinter.LEFT)

word_repeat_label = Tkinter.Label(key_watcher,
                           text="Type the same to calculate the time")

word_repeat_label.pack(side=Tkinter.LEFT)

word_repeat_box = Tkinter.Entry(key_watcher)
word_repeat_box.pack(side=Tkinter.RIGHT)

word_entry_box.focus()


def pressed(keyevent):
  # print keyevent  #Left this in for debugging, you can see the key press.
  # start = time.time()  #start time will be reset every time this is called.
  first_word = word_entry_box.get()
  first_word_size = len(first_word)
  first_letter_list = tuple(first_word)
  first_word_first_letter = str(first_letter_list[0])
  first_word_last_letter = str(first_letter_list[-1])

  repeat_word = word_repeat_box.get()
  repeat_word_size = len(repeat_word)

  if repeat_word_size > 0:
      repeat_letter_list = tuple(repeat_word)
      repeat_word_first_letter = str(repeat_letter_list[0])
      repeat_word_last_letter = str(repeat_letter_list[-1])

  # Lets see whats happening on each press:
  print "Pressed:", keyevent.char
  print "First word:", first_word, "size", first_word_size
  print "repeat word:", repeat_word, "size", repeat_word_size

  # now that all the things we want to look at are defined, lets logic:

  if repeat_word_size == 1:
      global start
      start = time.time()
      print "time started!", start

  if first_word_size == repeat_word_size:
      print "words are same size"

      if first_word_last_letter == repeat_word_last_letter:
          global end
          stop = time.time()
          totaltime = stop - start
          print "Total time taken", totaltime

word_repeat_box.bind("<KeyRelease>", pressed)
key_watcher.mainloop()  # mainloop() should be called last, it starts your loop
Pressed: t
First word: test size 4
repeat word: t size 1
time started! 1434046015.13
Pressed: e
First word: test size 4
repeat word: te size 2
Pressed: s
First word: test size 4
repeat word: tes size 3
Pressed: t
First word: test size 4
repeat word: test size 4
words are same size
Total time taken 1.69620299339