计算 Python 中一系列关键事件之间的时间
Calculate the time between a range of key events in Python
作为我的自学项目的一部分,我决定在 Python 中创建一个应用程序,用于侦听某些 keyevents
并找出键入单词所需的时间。经过 12 多个小时的直接调试和 loop/logic 实验,我所能做的就是:
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)
绑定键并将其传递给 pressed
方法后,我不确定如何取消绑定该特定键并绑定元组中的下一个值。
预期结果
如果我输入单词,'Obliteration' 程序应该告诉我从 keyevent
"O" 到 keyevent
"n" 需要多少时间。
Tkinter 中事件 <Key>
的预期结果是什么?
这很有趣!
我根据 pep8 重写了您的代码。
调整了变量名以提高可读性。
您定义开始时间的方式存在一些逻辑错误。
考虑到每次按下一个键时,都会调用 pressed()
。如何检测按键也存在一个隐藏的问题。您的代码有:
word_repeat_box.bind("<Key>", pressed)
"<KEY>"
捕捉到按键的按下,你想要按键的RELEASE。
否则在释放键之前调用该函数,并将值输入重复框。我将其改为使用 <KeyRelease>
。 (随意运行我调试的代码来比较"<KEY>"
和"<KeyRelease>"
)
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
这或许可以在没有全局变量的情况下完成,也许可以通过递归调用来完成,但我会把它留给你来解决。
作为我的自学项目的一部分,我决定在 Python 中创建一个应用程序,用于侦听某些 keyevents
并找出键入单词所需的时间。经过 12 多个小时的直接调试和 loop/logic 实验,我所能做的就是:
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)
绑定键并将其传递给 pressed
方法后,我不确定如何取消绑定该特定键并绑定元组中的下一个值。
预期结果
如果我输入单词,'Obliteration' 程序应该告诉我从 keyevent
"O" 到 keyevent
"n" 需要多少时间。
Tkinter 中事件 <Key>
的预期结果是什么?
这很有趣!
我根据 pep8 重写了您的代码。
调整了变量名以提高可读性。
您定义开始时间的方式存在一些逻辑错误。
考虑到每次按下一个键时,都会调用 pressed()
。如何检测按键也存在一个隐藏的问题。您的代码有:
word_repeat_box.bind("<Key>", pressed)
"<KEY>"
捕捉到按键的按下,你想要按键的RELEASE。
否则在释放键之前调用该函数,并将值输入重复框。我将其改为使用 <KeyRelease>
。 (随意运行我调试的代码来比较"<KEY>"
和"<KeyRelease>"
)
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
这或许可以在没有全局变量的情况下完成,也许可以通过递归调用来完成,但我会把它留给你来解决。