Функция, которая считает в качестве подпроцесса - PullRequest
0 голосов
/ 03 июня 2018

У меня проблема с запуском программы Tkinter GUI (викторина).В то время как пользователь имеет выбор из 4 кнопок и может выбрать одну, мне нужен таймер обратного отсчета, который изменит вопрос, когда время будет равно нулю.Он мне нужен как подпроцесс или отдельный поток, потому что пользователь не сможет выбрать ответ иначе.

Это отличается от других вопросов о таймерах, потому что ответы на эти вопросы включают [Object] = threading.Timer(numCount, callback), но Таймерне возвращает свое значение, так как считает.

Есть ли способ сделать это?Я уже пробовал несколько методов, в том числе модуль потоков и часы Pygame (: D).

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Вы можете использовать signal:

def myfunc(sig, frame):
    print("timer fired")

signal.signal(signal.SIGALRM, myfunc)
signal.alarm(4) # seconds
0 голосов
/ 03 июня 2018

Многопоточность может не потребоваться: вы можете использовать метод after, чтобы изменить вопрос по истечении времени, сохраняя при этом ваш графический интерфейс реагирующим:

В следующем примере вопрос меняется каждые 10 секунд.

import tkinter as tk


def countdown(t):
    cdn['text'] = f'{t}'
    if t > 0:
        root.after(1000, countdown, t-1)


def change_question(idx):
    lbl['text'] = questions[idx % 2]
    root.after(10000, change_question, idx+1)
    countdown(10)


def clickme(t):
    print(f"{lbl['text']} : {t}")


if __name__ == '__main__':

    questions = ['Is multi-threading necessary?', 'Is simple better than complicated?']
    root = tk.Tk()
    bt1 = tk.Button(root, text='Yes', command=lambda: clickme('Yes'))
    bt2 = tk.Button(root, text='No', command=lambda: clickme('No'))
    bt3 = tk.Button(root, text='Maybe', command=lambda: clickme('Maybe'))
    bt4 = tk.Button(root, text='No Idea', command=lambda: clickme('No Idea'))
    lbl = tk.Label(root, text='')
    cdn = tk.Label(root, text='')
    cdn.pack()

    lbl.pack()
    bt1.pack()
    bt2.pack()
    bt3.pack()
    bt4.pack()
    change_question(0)
    root.mainloop()

пример вывода:

Is multi-threading necessary? : No
Is simple better than complicated? : Yes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...