Как я могу сделать что-то в течение некоторого времени l oop с определенным интервалом, не прерывая все l oop? - PullRequest
0 голосов
/ 04 августа 2020

У меня есть следующий код, который почти выполняет то, что мне нужно:

import threading
import sched, time


def printit():
  threading.Timer(10.0, printit).start()
  print("Hello, World!")
  
  
x=25
printit()

while x>1:
    time.sleep(1)
    print(x)
    x=x-1 

Он печатает «Hello, World!». каждые 5 секунд при одновременном обратном отсчете числа от 25 до 2. Проблема, с которой я столкнулся, заключается в том, что я хочу написать "Hello, World!" в пределах l oop, чтобы он остановился, когда обратный отсчет остановится. Когда я добавляю его к l oop, он говорит: «Привет, мир!» каждую секунду, а также каждые 5 секунд, и когда l oop заканчивается, он все еще продолжается. Я думаю, что использую неправильный модуль, но я не уверен.

Изменить: это код, к которому я пытаюсь применить его:

import threading
import sched, time
import numpy as np
import cv2
import imutils


flag = False
def printit():
    while(flag):
        print("Hello, world!")
        time.sleep(30)
          
t = threading.Thread(target=printit)
t.start()

fullbody_cascade = cv2.CascadeClassifier('haarcascade_fullbody.xml') #creates variables for the different cascades
upperbody_cascade = cv2.CascadeClassifier('haarcascade_upperbody.xml')
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap0 = cv2.VideoCapture(0) #chooses camera to be utilized

while True:
    
    ret0, frame0 = cap0.read() #reads the frames of the chosen camera
    
    gray0 = cv2.cvtColor(frame0, cv2.COLOR_BGR2GRAY) #converts to grayscale
     
    fullbody0 = fullbody_cascade.detectMultiScale(gray0) #detects the grayscaled frame
    upperbody0 = upperbody_cascade.detectMultiScale(gray0)
    face0 = face_cascade.detectMultiScale(gray0)
     
    for (x,y,w,h) in fullbody0:
        cv2.rectangle(frame0, (x,y), (x+w, y+h), (0,0,255), 2) #creates red a box around entire body
        
    for (x,y,w,h) in upperbody0:
        cv2.rectangle(frame0, (x,y), (x+w, y+h), (255,0,0), 2) #creates a blue box around upper body
    
    for (x,y,w,h) in face0:
        cv2.rectangle(frame0, (x,y), (x+w, y+h), (0,255,0), 2) #creates a green box around face
        flag = True
        time.sleep(0.5)
        
            
    flag = False 
    
    cv2.imshow('cam0',frame0)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cv2.destroyAllWindows()
  

Я пытался реализовать это так, но работает не так, как задумано. Если условие одного из циклов for выполняется быстро, он быстро печатает «Hello, World!», Как я могу изменить это так, чтобы он всегда печатал только «Hello, World!». каждые x секунд независимо от того, сколько раз выполняются условия для l oop.

Редактировать 2: приведенный выше код теперь работает, поскольку я немного отредактировал его, проблема заключалась в том, что для l oop двигался слишком быстро, так что сообщение печати не отображалось, добавив time.sleep (0.5) после оператора flag = True, он смог распечатать сообщение. Спасибо Ориусу за помощь!

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Вы хотите распечатать эти сообщения, только когда действует третье для l oop, верно? Я не могу запустить код, так как у меня нет доступа к некоторым ресурсам, но, надеюсь, это должно сработать:

import threading
import sched, time
import numpy as np
import cv2
import imutils

flag = False

def printit():
    while (True):
        time.sleep(2)
        if (flag)
            print("Hello, world!")  

t = threading.Thread(target=printit)
t.start()

fullbody_cascade = cv2.CascadeClassifier('haarcascade_fullbody.xml') #creates variables for the different cascades
upperbody_cascade = cv2.CascadeClassifier('haarcascade_upperbody.xml')
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
cap0 = cv2.VideoCapture(0) #chooses camera to be utilized

while True:
    
    ret0, frame0 = cap0.read() #reads the frames of the chosen camera
    
    gray0 = cv2.cvtColor(frame0, cv2.COLOR_BGR2GRAY) #converts to grayscale
     
    fullbody0 = fullbody_cascade.detectMultiScale(gray0) #detects the grayscaled frame
    upperbody0 = upperbody_cascade.detectMultiScale(gray0)
    face0 = face_cascade.detectMultiScale(gray0)
     
    for (x,y,w,h) in fullbody0:
        cv2.rectangle(frame0, (x,y), (x+w, y+h), (0,0,255), 2) #creates red a box around entire body
        
    for (x,y,w,h) in upperbody0:
        cv2.rectangle(frame0, (x,y), (x+w, y+h), (255,0,0), 2) #creates a blue box around upper body
    
    flag = True
    for (x,y,w,h) in face0:
        cv2.rectangle(frame0, (x,y), (x+w, y+h), (0,255,0), 2) #creates a green box around face
    flag = False 
    
    cv2.imshow('cam0',frame0)
    k = cv2.waitKey(30) & 0xff
    if k == 27:
        break

cv2.destroyAllWindows()
0 голосов
/ 04 августа 2020

Попробуйте выполнить

t = threading.Timer(5.0, printit)
t.start()

вместо

threading.Timer(5.0, printit).start()

, а затем, когда вы хотите, чтобы он остановился (после того, как l oop закончился), выполните

t.cancel()

Надеюсь, это поможет!

Изменить:

О, вам нужно, чтобы t был доступен извне printit (). Вы можете объявить его вне printit () или, например, заставить printit () вернуть его.

Edit 2:

Извините, но есть проблема, что вы передаете printit () в timer, где printit () создает таймер, поэтому есть al oop.

Вот как это должно быть сделано:

import threading
import sched, time


def printit():
  print("Hello, World!")

t =  threading.Timer(5.0, printit)
t.start() 
  
x=25
printit()

while x>1:
    time.sleep(1)
    print(x)
    x=x-1

t.cancel()

Edit 3:

С потоком вместо таймера:

import threading
import sched, time

flag = True

def printit():
    while(flag):
        time.sleep(5)
        print("Hello, world!")  
  
t = threading.Thread(target=printit)
t.start()

x=25

while x>1:
    time.sleep(1)
    print(x)
    x=x-1 

flag = False
...