Можно ли дождаться нажатия кнопки, но если кнопка не нажата, программа вернется? - PullRequest
0 голосов
/ 26 апреля 2019

Поэтому я пытаюсь написать программу, в которой пользователь находится на экране в графическом интерфейсе Tkinter, и хочу, чтобы система запускалась с самого начала, если физическая кнопка не нажата.

def start():
    #creating instance
    window = Tk()


def btnclicked(): #ignore this name as its for another button
    def endgame():
        lbltitleend = Label(window, text="Press the button within 5 seconds to quit or the game will restart.", font=("Arial bold", 15), fg="white", bg="black", pady= 15)
        lbltitleend.pack()

        for objectx in objects:
            objectx.destroy()


        def buttonpress():
            while True:
                time.sleep(5)
                if (GPIO.input(22) == True):
                    window.destroy()
                    print("Thanks for playing!")
                    del objects[:]
                else:
                    start()


        window.after(500, buttonpress) # Need this so that the program doesnt stall waiting for button to be pressed, and executes everything before the button can be pressed

Так что это просто заканчивается тем, что запускается, и поэтому через 5 секунд времени. Сон заканчивается тем, что он просто запускает программу снова и вызывает новое окно графического интерфейса, которое я не возражаю, но это не то, что я хочу.

Я хочу, чтобы программа ожидала нажатия кнопки, и если она не нажата в течение 5 секунд, я хочу, чтобы она перезапустилась.

Есть ли способ сделать это?

1 Ответ

1 голос
/ 27 апреля 2019

Это не так сложно, как вы уже знаете о функции after(), есть еще одна функция, с помощью которой мы можем остановить обработку потока after, который after_cancel(id). «id» - это то, что возвращает after ().

Вот пример того, как вы можете остановиться до истечения 5 секунд.

from tkinter import *

root = Tk()
root.geometry('250x250')

display = Label(root, text='Hello', font=('', 20))
display.pack(pady=40)

def restart():
    display['text'] = 'Restarting...'
    but['state'] = 'disable'            # Once restarted the button gets disabled

def cancel():
    # Cancel the current after with it id
    root.after_cancel(L)
    display['text'] = 'Cancelled'

# Take a reference of after
L = root.after(5000, restart)

but = Button(root, text='Cancel', command = cancel )
but.pack(side='bottom', pady=30)

mainloop()

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

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