单击条目小部件时如何启动计时器

时间:2019-04-27 13:34:33

标签: python tkinter timing

当我单击条目窗口小部件时,我正在尝试启动计时器,但是我不知道如何做。

我有一个加载tk窗口的程序,一旦窗口打开,计时器就会启动。我有一个重置计时器的按钮,但是我希望它能使计时器仅在我在输入框中单击时才启动。 我还设置了绑定设置,以便在我按Enter键时将文本传递到函数中并进行打印。

from tkinter import *
from tkinter import messagebox
counter = 0


def counterlabel(label):
    def count():
        global counter

        counter += 1
        label.config(text=str(counter))
        label.after(1000, count)

    count()


def game(*args):
    x = entry.get()
    print(x)


def reset(label):
    global counter
    counter = 0
    label.config(text=str(counter))


root = Tk()
root.title("hello")
quit = Button(root, command=lambda: root.destroy())
quit.pack()

label = Label(root)
label.pack()

button = Button(
    root, text="hit me to reset timer",
    command=lambda: reset(label))
button.pack()

entry = Entry(root)
entry.bind("<Return>", game)
entry.pack()

counterlabel(label)
root.mainloop()

1 个答案:

答案 0 :(得分:0)

为什么不将Entry小部件与带有计数器的<Button-1>序列绑定,所以当用户单击Entry小部件时,计时器启动,其余时间按您的编程。

尝试一下:

entry.bind( "<Button-1>",lambda e: counterlabel(label) )

我也不知道为什么要使此功能如此复杂,以防万一,如果以后有其他计划要在功能中添加更多代码,则可以只使一个功能而不是其中一个功能。

可能就是这个

def count(evt=None):
    global counter
    counter += 1
    label.config(text=str(counter))
    label.after(1000, count)

...

root=Tk()

...

entry.bind( "<Button-1>", count) )

要在按下按钮时停止计时器

为此,您必须获取after()函数的ID并将其传递给after_cancel(id)函数(id = after(1000, count))。当您点击Entry时,它将重新开始。

这是完整的代码

from tkinter import *
from tkinter import messagebox

counter = 0
timer_id = None

def count(evt=None):
    global counter, timer_id
    entry.unbind('<Button-1>')  # So the timer won't go crazy on multiple presses.
    counter += 1
    label.config(text=str(counter))
    timer_id = label.after(1000,count)

def game(*args):
    x=entry.get()
    print(x)

def reset(label):
    global counter
    counter=0
    if timer_id: label.after_cancel(timer_id)
    entry.bind('<Button-1>', count)    # When reset the user can start again 
    label.config(text=str(counter))

root=Tk()
root.title("hello")
quit=Button(root,command=lambda: root.destroy())
quit.pack()

label=Label(root, text='0')
label.pack()

button=Button(root,text="hit me to reset timer",command=lambda: reset(label))
button.pack()

entry=Entry(root)
entry.bind("<Return>", game)
entry.bind('<Button-1>', count)
entry.pack()

root.mainloop()

希望这对您有帮助