2016-07-26 2 views
3

Я новичок в программировании и хотел бы добавить счетчик, который вычитает 1 из вашей оценки каждые две секунды. (Так что я должен ответить быстро, чтобы сделать мой счет увеличения)Таймер без нарезки в python?

chr 
import random 
import time 
radians2 = None 
ans = None 
score = 0 

radians1 = ['0', 'π/6', 'π/3', 'π/4', 'π/2', '2π/3', '3π/4', '5π/6', 'π', '7π/6', '4π/3', '5π/4', '3π/2', '5π/3', '7π/4', '11π/6', '2π'] 
while radians2 == ans or ans == None: 

radians3 = (random.choice(radians1)) 
ans = input(radians3) 
if radians3 == '0': 
    radians2 = 0 

elif radians3 == 'π/6': 
    radians2 = 30 

elif radians3 == 'π/3': 
    radians2 = 60 

elif radians3 == 'π/4': 
    radians2 = 45 

elif radians3 == 'π/2': 
    radians2 = 90 

elif radians3 == '2π/3': 
    radians2 = 120 

elif radians3 == '3π/4': 
    radians2 = 135 

elif radians3 == '5π/6': 
    radians2 = 150 

elif radians3 == 'π': 
    radians2 = 180 

elif radians3 == '7π/6': 
    radians2 = 210 

elif radians3 == '4π/3': 
    radians2 = 240 

elif radians3 == '5π/4': 
    radians2 = 225 

elif radians3 == '3π/2': 
    radians2 = 270 

elif radians3 == '5π/3': 
    radians2 = 300 

elif radians3 == '7π/4': 
    radians2 = 315 

elif radians3 == '11π/6': 
    radians2 = 330 

elif radians3 == '2π': 
    radians2 = 360 
score = score + 1 

if radians2 == ans: 
    print('Correct!') 
    print "You've got %d in a row" % score 
print "You lose, the correct answer was %d" % radians2 

К сожалению, если код грязный/длинный я понял, что я хочу, чтобы в основном запустить что-то вроде:

while 1: 
    time.sleep(2) 
    score = score - 1 

единственная проблема заключается в том, что она не будет работать одновременно с остальной частью программы, а потоковая передача (которая, как представляется, является альтернативой) очень запутанна для меня.

+1

Извините, но «одновременно» означает, что вам нужна резьба. И да, нарезание резьбы может сбивать с толку, но еще хуже погрузиться в нее. –

+0

Альтернатива нарезания резьбы - mainloop - возможно, намного более запутанна. Threading не так уж сложно. –

+4

um, не можете ли вы просто измерить время ('time.clock()' или 'datetime.datetime.now()'), прежде чем спрашивать пользователя, а затем снова? Разница в том, сколько времени им потребовалось, чтобы ответить, здесь нет необходимости в потоках или петлях. –

ответ

1

Вы можете создать новый поток, используя следующий код и написать свою функциональную логику в своем методе run().

import threading 
import time 

class RepeatEvery(threading.Thread): 
    def __init__(self, interval): 

     threading.Thread.__init__(self)  
     self.interval = interval # seconds between calls 
     self.runable = True 

    def run(self): 
     global score # make score global for this thread context 
     while self.runable: 
      time.sleep(self.interval) 
      if self.runable:  
       score = score - 1 
       self.runable = False 

    def stop(self): 
     self.runable = False 

Приведенный выше код итерации, пока поток не является работоспособной (self.runable = True), так что после 2-х секунд оценка будет уменьшаться на 1. и петлей внутри метода выполнения будет разорвать, и будет прекращено.

Итак, для того, чтобы вызвать верхнюю нить, сделайте это.

score_thread = RepeatEvery(2) 
score_thread.start()  

это будет вызывать конструктор НИТЬ инициализации и инициализировать переменную интервал 2 секунды или какой-либо значение, переданное здесь.

Чтобы остановить поток между тем, просто вызовите метод stop().

score_thread.stop() 

Вы также можете вызвать метод join(), чтобы подождать, пока поток завершит его выполнение.

score_thread.join() 

ли не выглядит так запутано :)

+0

Когда я пытаюсь вызвать поток, он говорит, что RepeatEvery не определен. Я не уверен, где в коде я должен поместить стартовые строки. – Warstolrem

+0

только что отредактировал ответ –

+0

Все еще вызывает у меня проблемы, говорит, что мне не хватает модуля (у меня есть threading) и говорит, что RepeatEvery не определен – Warstolrem

1

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

def timer(): 
    prev_time = new_time = 0 
    while True: 
     prev_time, new_time = new_time, time.clock() 
     time_delta = new_time - prev_time 
     yield time_delta 

>>> t = timer() 
>>> t.next() 
4.399568842253459e-06 
>>> t.next() 
1.7571719571481994 
>>> t.next() 
0.8449679931366727 
Смежные вопросы