2016-05-03 16 views
0

Ich versuche, einen Hörtest zu schreiben, der Töne mit immer lauteren Lautstärken wiedergibt, bis er die Liste der Lautstärken durchlaufen hat oder vom Benutzer eingegeben wurde und anzeigt, dass er den Ton gehört hat. Um dies zu tun, versuche ich das Skript zu erhalten, um während der Eingabe immer noch eine Schleife einzugeben, um die Volumes zu erhöhen, aber normalerweise wird input() das Skript stoppen. Und die Fäden scheinen nach dem ersten Looping nicht mehr zu funktionieren. Dies ist, was ich mit so weit kam:Python wartet auf Eingabe beim Ausführen des Skripts

def tone_stopper(): 
    """This function will take as input a pressed key on the keyboard and give 
    True as output""" 
    test = input("Press enter when you hear a tone: ") 
    if test == " ": 
     return True 


def call_play_file(frequency, vol_list): 
    """This function will play a frequency and stop when the user presses 
    a button or stop when it reaches the loudest volume for a frequency, 
    it takes as an input a frequency and a list of volumes 
    and returns the loudness at which the sound was playing when a button was 
    pressed""" 
    for volume in vol_list: #plays a tone and then repeats it a different vol 
     tone_generator(frequency, volume) 
     play_file('hearingtest.wav') 
     if thread == True: 
      return frequency, volume 

    return frequency, "didn't hear" #in case no button is pressed 

thread = threading.Thread(target = tone_stopper()) 
thread.setDaemon(True) 
thread.start() 
vol_list = [4, 8, 12]; 
freq_left_right = random_freq_list(200, 18000, 500) 
startplaying = call_play_file(freq_left_right, vol_list) 

das Skript zu verhindern, extrem lang ist es zu zwei Funktionen bezieht, die ich hier nicht definiert haben.

+0

Nun, es ist in einem separaten Thread. Ist das nicht die Idee des Threading? – TigerhawkT3

Antwort

1

Wenige Probleme mit Ihrem Thread. Wenn Sie Ihren Thread erstellen und das Ziel übergeben, tun Sie

Dies ruft die Funktion auf. Du solltest das Ziel so passieren.

thread = threading.Thread(target = tone_stopper) 

Sie überprüfen auch if thread == True. Sie sollten thread.is_alive() überprüfen, wenn Sie überprüfen möchten, ob der Thread aktiv ist.

Aber alles, was Sie hier wollen, ist zu sehen, ob der Benutzer irgendetwas mit der input Eingabeaufforderung eingegeben hat. In diesem Fall wird der Thread beendet.

Also, sollten Sie einfach überprüfen if not thread.is_alive()

Hier ist ein völlig nutzlos Beispiel einfach zeigen, dass der Thread beendet wird, wenn ein Benutzer Hits ein.

import threading 

def test_thread(): 

    input("Press enter when you hear the sound.") 

def test_func(): 

    while thread.is_alive(): 
     pass 

    print("Thread is over. User heard a sound.") 

thread = threading.Thread(target=test_thread) 
thread.daemon = True 
thread.start() 
test_func() 
+0

Danke für Ihre Antwort! Wäre es möglich, den Thread wieder zu beleben, nachdem er überprüft hat, ob er am Leben ist? Andernfalls könnte diese Methode nur einmal verwendet werden, wenn der Benutzer einen Ton gehört hat, oder? –

Verwandte Themen