Как запустить таймер, когда я нажимаю на виджет ввода - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь запустить таймер, когда нажимаю на виджет ввода, но понятия не имею, как это сделать.

У меня есть программа, которая загружает окно ТК, иТаймер запускается, как только открывается окно.У меня есть кнопка, которая сбрасывает таймер, но мне бы хотелось, чтобы таймер запускался только тогда, когда я щелкаю внутри поля ввода.У меня также есть настройка привязки, так что когда я нажимаю клавишу ввода, текст передается в функцию и печатается.

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 голосов
/ 27 апреля 2019

Почему бы не связать виджет 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()

Надеюсь, это помогло

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...