在 Tkinter Entry 上绑定多个事件?
Binding multiple events on Tkinter Entry?
我想捕获一个人输入密码所用的时间(以毫秒为单位),即从第一次按键到该人按下 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()
我遇到的问题是我无法在 pass1
上绑定 callback1
和 callback2
。我想要的是当一个人按下他们密码的第一个键时,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()
接下来,您只想允许 callback1 到 运行 一次。为此,请像这样
将其与小部件解除绑定
def callback1(self, event):
self.start=time.time()*1000.0
self.pass1.unbind('<Key>') # unbind callback1
然后在按下 Enter 键后最终重新绑定它,所以在 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
旁注:
如您所见,我将时间顺序更改为 end - start
,而不是之前的 start - end
,这会给您一个负值。
我还建议将 '<Key>'
更改为 '<KeyRelease>'
如果您不想取消绑定函数,您的其他选择是使用 if 语句检查 self.start
是否有值。
if self.start == 0.0:
self.start=time.time()*1000.0
您还应该将变量放在 __init__
函数中。
def __init__(self, master):
self.start=0.0
self.end=0.0
self.total_time=0.0
...
我想捕获一个人输入密码所用的时间(以毫秒为单位),即从第一次按键到该人按下 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()
我遇到的问题是我无法在 pass1
上绑定 callback1
和 callback2
。我想要的是当一个人按下他们密码的第一个键时,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()
接下来,您只想允许 callback1 到 运行 一次。为此,请像这样
将其与小部件解除绑定def callback1(self, event):
self.start=time.time()*1000.0
self.pass1.unbind('<Key>') # unbind callback1
然后在按下 Enter 键后最终重新绑定它,所以在 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
旁注:
如您所见,我将时间顺序更改为 end - start
,而不是之前的 start - end
,这会给您一个负值。
我还建议将 '<Key>'
更改为 '<KeyRelease>'
如果您不想取消绑定函数,您的其他选择是使用 if 语句检查 self.start
是否有值。
if self.start == 0.0:
self.start=time.time()*1000.0
您还应该将变量放在 __init__
函数中。
def __init__(self, master):
self.start=0.0
self.end=0.0
self.total_time=0.0
...