Может быть полезно кому-то:
Если вы хотите использовать простые опции вместо ng-options, вы можете сделать это, как показано ниже:
<select ng-model="sortorder" ng-init="sortorder='publish_date'">
<option value="publish_date">Ascending</option>
<option value="-publish_date">Descending</option>
</select>
Установите модель в строке. Используйте ng-init, чтобы избавиться от пустой опции
Что касается ваших вопросов:
t.cancel()
(остановите таймер и не вызывайте функцию) вместо t.join()
(дождитесь окончания потока; это конечно, ВСЕГДА приведет к тайм-ауту) while
и прервите его, как только вы знать, что ввод действителен ...
В общем, может быть проще обернуть структуру программы - пусть основной поток обрабатывает таймаут и проверку ввода, пусть поток обрабатывает только ввод (таким образом, легко убить поток, чтобы остановить обработку ввода).
Конечно, используя модуль select
, можно реализовать это даже лучше без потоков (есть один канал, который записывается потоком / таймером и стандартным вводом, затем выбирает оба для чтения и блокирует до ввода пользователя или тайм-аута происходит).
А может кто-нибудь опубликует хорошее решение на основе asyncio
? ;)
Вот модифицированное решение (изменяя настолько мало, насколько это возможно, чтобы заставить его работать, можно реорганизовать другие части, чтобы сделать его лучше в целом):
import random
import threading
import os
def timeout():
print("Time over\n#####################\n")
# You can't use sys.exit() here, as this code is running in a thread
# See also: https://stackoverflow.com/a/905224/1047040
os._exit(0)
while True:
list = []
for i in range(5):
list.append(random.randint(1000, 10000))
t = threading.Timer(5, timeout)
t.start()
print(list)
print('[ 1 , 2 , 3 , 4 , 5 ]')
solution = sorted(list)[2]
while True:
try:
print('please select the 3rd largest number in this row (1-5):')
input_string = input()
selection = int(input_string)
chosen = list[selection - 1]
# If we arrive here, the input was valid, break out of the loop
break
except Exception as e:
# Tell the user that the input is wrong; feel free to remove "e"
# from the print output
print('Invalid input:', e)
if solution == chosen:
print("Your guess is correct\n")
else:
print("Your guess is wrong\n")
# Make sure to cancel the thread, otherwise guessing correct or wrong
# will block the CLI interface and still write "time out" at the end
t.cancel()