在 Tkinter Entry 上绑定多个事件?

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)

我遇到的问题是我不能够绑定callback1callback2pass1。我想要的是当一个人按下他们密码的第一个键时,start设置为当前时间,而当人按下时Enter end初始化为当前时间。我希望这两个人能给我一个大概的时间。

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

Ste*_*ers 6

首先,您需要绑定callback2Enter / 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)