2016-07-26 49 views
3

Ich bin neu in der Programmierung und möchte einen Zähler hinzufügen, der alle zwei Sekunden 1 von Ihrem Punktestand abzieht. (So ​​dass ich schnell Antwort auf meine Punktzahl zu erhöhen machen)Timer ohne Threading in 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 

Sorry, wenn der Code chaotisch/lang ich herausgefunden, dass ich will etwas im Grunde laufen wie:

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

Der Das einzige Problem ist, dass es nicht gleichzeitig mit dem Rest des Programms läuft und Threading (was die Alternative zu sein scheint) ist sehr verwirrend für mich.

+1

Entschuldigung, aber "gleichzeitig" bedeutet, dass Sie Threading benötigen. Und ja, Threading kann verwirrend sein, aber es ist noch schlimmer, sich darauf einzulassen. –

+0

Die Alternative zum Threading - eine Hauptschleife - ist wahrscheinlich viel verwirrender. Threading ist gar nicht so schwer. –

+4

um, können Sie nicht einfach die Zeit messen ('time.clock()' oder 'datetime.datetime.now()'), bevor Sie den Benutzer fragen und danach erneut? Der Unterschied ist die Zeit, die sie brauchen, um zu antworten, es gibt keine Notwendigkeit für Threads oder Schleifen hier. –

Antwort

1

Sie können einen neuen Thread starten, indem Sie den folgenden Code verwenden und schreiben Sie, was auch immer Ihre funktionale Logik in der run() -Methode.

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 

Der obige Code wird iteriert, bis Thread runnable ist (self.runable = True), also nach 2 Sekunden erzielen wird um 1 und Schleife im Inneren des Run-Methode dekrementiert wird brechen und wird beendet.

Also, um oben Thread zu tun dies tun.

score_thread = RepeatEvery(2) 
score_thread.start()  

dies wird der Faden Konstruktor init aufrufen und wird die Intervallvariable mit mindestens 2 Sekunden beliebigen Wert von hier aus weitergeleitet initialisieren.

Um den Thread in der Zwischenzeit zu stoppen, rufen Sie einfach die stop() Methode auf.

Sie können auch die Methode join() aufrufen, um zu warten, bis der Thread seine Ausführung beendet hat.

score_thread.join() 

nicht mehr so ​​verwirrend aussieht :)

+0

Wenn ich versuche, den Thread aufzurufen, heißt es, dass RepeatEvery nicht definiert ist. Ich bin mir nicht sicher, wo im Code ich auch die Startlinien platzieren soll. – Warstolrem

+0

nur die Antwort bearbeitet –

+0

Noch verursacht mich Probleme, sagt, ich vermisse ein Modul (Ich habe Threading) und sagt, dass RepeatEvery nicht definiert ist – Warstolrem

1

Sie einen corutine verwenden kann, wenn Sie nicht wollen, jeden Thread verwenden, jedes Mal, wenn Sie die nächste Methode des Generators nennen es die verstrichene Zeit-Ausbeute:

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