Python: Помогите исправить функцию сброса на моем секундомере - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь сделать секундомер, отсчитывающий от 0, который можно перезапустить, когда он получит ввод пользователя. Однако, когда я пытаюсь выполнить функцию сброса, она не сбрасывает таймер на 0, а просто продолжает считать. Я использую потоки, чтобы он продолжал считать и ждать ввода данных пользователем, поэтому я не уверен, как это исправить:

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();

Если кто-нибудь может сказать мне, как вернуть его в исходное состояние 0 после ввода пользователя это будет очень полезно.

1 Ответ

0 голосов
/ 12 июля 2020

s в вашем коде является локальной переменной в функции count, поэтому вы не можете изменить его в i_input.

Когда вы делаете s=0 в i_input, это только что определил другую локальную переменную, также названную s, но она является локальной для другой области видимости, поэтому она не меняет count s s.

Решение состоит в том, чтобы сделать s глобальной переменной . Вы можете сделать это, определив его на верхнем уровне, а затем поместив global s в функции, чтобы он не затенялся локальной переменной.

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()
...