Próbuję zrobić stoper, licząc od 0, który można ponownie uruchomić, gdy otrzymuje wejście użytkownika. Jednak gdy wypróbuję funkcję RESET, nie resetuje się znikiem na 0, ale po prostu kontynuuje liczenie. Używam gwintowania, aby kontynuował liczenie i czekać na wejście użytkownika, więc nie jestem pewien, jak go naprawić:

import time                   
import signal          
import threading    


def interrupted(signum, frame):          
    pass

signal.signal(signal.SIGALRM, interrupted) 

def count(s):      
   
    while True:
            print(format(s))
            s = s+1
            time.sleep(1)
        

def i_input():    #this is the alert for interaction and the reset trigger when interacted with.
    try:
        print('Starting Stopwatch')
        interact = input()
        print('Stopwatch Reset.')
        s=0
        i_input()
        
    except:
        return
        

def count(s):     
    while True:
        print(s)
        s = s+1
        time.sleep(1)
  



threading.Thread(target = i_input).start()
countThread = threading.Thread(target=count, args=(0,));
countThread.start();

Jeśli ktoś mógł mi powiedzieć, jak przywrócić 0 na wejściu użytkownika, byłoby bardzo docenione.

-2
budoya 12 lipiec 2020, 09:02

1 odpowiedź

Najlepsza odpowiedź

s W swoim kodzie jest zmienna lokalna w funkcji count, więc nie możesz go zmienić w i_input.

Kiedy to robisz i_input w i_input, to właśnie zdefiniowano inną zmienną lokalną również nazwaną s, ale jest lokalny do innego zakresu, więc nie zmienia count 's { {X4}}.

Rozwiązaniem jest wykonanie zmiennej globalnej s. Możesz to zrobić, definiując go na najwyższym poziomie, a następnie umieszczanie global s w funkcjach, więc nie zostanie zacienione przez zmienną lokalną.

import time
import threading


def count(): 
    global s    
    while True:
        print(s)
        s += 1
        time.sleep(1)
        

def i_input():  # this is the alert for interaction and the reset trigger when interacted with.
    global s
    print('Starting Stopwatch')
    interact = input()
    print('Stopwatch Reset.')
    s = 0
    i_input()


s = 0
threading.Thread(target=i_input).start()
threading.Thread(target=count).start()
0
nog642 12 lipiec 2020, 06:58