在 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 上绑定 callback1callback2。我想要的是当一个人按下他们密码的第一个键时,start 被设置为当前时间,当这个人按下 Enterend 被初始化为当前时间。希望这两位能给我大概的时间。

如何修改上面的程序来完成我想要的?谢谢。

首先,您需要将 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
    ...