Nat*_*ara 5 python tkinter key-bindings
我想捕获一个人输入密码所花费的时间(以毫秒为单位),即从第一次按键到该人按下Enter按钮的时间。为了实现这一点,我有以下代码:
import tkinter as tk
import time
class MyApp(object):
start=0.0
end=0.0
total_time=0.0
def __init__(self, master):
self.pass1 = tk.Entry(master,show="*")
self.pass1.bind('<Key>', self.callback1)
self.pass1.pack()
def callback1(self, event): # Called Only by first key press
self.start=time.time()*1000.0 # start variable must be modified ONLY by first key press
def callback2(self,event): # called by Enter Key press
self.end=time.time()*1000.0
self.total_time=self.start-self.end
print(self.totaltime)
root = tk.Tk()
app = MyApp(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我不能够绑定callback1和callback2上pass1。我想要的是当一个人按下他们密码的第一个键时,start设置为当前时间,而当人按下时Enter end初始化为当前时间。我希望这两个人能给我一个大概的时间。
我如何修改上面的程序来完成我想要的?谢谢。
首先,您需要绑定callback2到Enter / Return Key这是使用 完成的'<Return>'。
def __init__(self, master):
self.pass1 = tk.Entry(master,show="*")
self.pass1.bind('<Key>', self.callback1)
self.pass1.bind('<Return>', self.callback2) # callback2 bound to Enter / Return key
self.pass1.pack()
Run Code Online (Sandbox Code Playgroud)
接下来,您只想允许回调 1 运行一次。为此,请像这样将其与小部件解除绑定
def callback1(self, event):
self.start=time.time()*1000.0
self.pass1.unbind('<Key>') # unbind callback1
Run Code Online (Sandbox Code Playgroud)
然后最后在按下回车键后重新绑定它,所以在callback2函数中
def callback2(self,event): # called by Enter Key press
self.end=time.time()*1000.0
self.total_time=self.end-self.start
print(self.total_time)
self.pass1.bind('<Key>', self.callback1) # rebind callback1
Run Code Online (Sandbox Code Playgroud)
附注:
正如您所看到的,我将时间的顺序更改为end - start而不是之前的顺序,start - end这会给您带来负值。
我还建议更改'<Key>'为'<KeyRelease>'
如果您不想取消绑定该函数,您的其他选择是使用 if 语句检查是否self.start有值。
if self.start == 0.0:
self.start=time.time()*1000.0
Run Code Online (Sandbox Code Playgroud)
您还应该将变量放入函数内__init__。
def __init__(self, master):
self.start=0.0
self.end=0.0
self.total_time=0.0
...
Run Code Online (Sandbox Code Playgroud)