Почему бы не связать виджет 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()
и передать ее в функцию 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()
Надеюсь, это помогло