Как сделать так, чтобы одна функция за время l oop выполнялась каждые x секунд, не останавливая остальную часть кода? Python - PullRequest
0 голосов
/ 08 апреля 2020

Я только начал учиться программировать 3 месяца go, поэтому извините, если этот вопрос звучит глупо. Здесь я пытаюсь заставить мой компьютер нажимать левую кнопку каждые 5 секунд, не останавливая пока l oop, чтобы он продолжал читать с экрана.

Я пытался использовать time.sleep (5) (но он останавливает функцию), и этот py.click (x, y, clicks = 2, interval = 5) 'делает то же самое.

import numpy as np
from PIL import ImageGrab
import cv2
import time
import pyautogui as py


def screen_record():
    while True:
        printscreen1 = np.array(ImageGrab.grab(bbox=(0, 40, 800, 600)))
        printscreen2 = np.array(ImageGrab.grab(bbox=(0, 40, 800, 600)))
        diff = cv2.absdiff(printscreen1, printscreen2)
        grey = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
        blur = cv2.GaussianBlur(grey, (5, 5), 0)
        _, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
        dilated = cv2.dilate(thresh, None, iterations=3)
        contours, _ = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
        for contour in contours:
            (x, y, w, h) = cv2.boundingRect(contour)
            if cv2.contourArea(contour) < 700:
                continue
            else:
                # py.click(x, y, clicks=2, interval=5)
                # time.sleep(5)
                cv2.rectangle(printscreen1, (x, y), (x + w, y + h), (0, 255, 0), 2)
        # cv2.drawContours(printscreen1, contours, -1, (0, 255, 0), 2)

        cv2.imshow('feed', printscreen1)

        if cv2.waitKey(25) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            break


screen_record()

1 Ответ

0 голосов
/ 08 апреля 2020

вы можете использовать, например, threading.Timer

import threading
import time

run = True

def main_loop():
    global run
    while run:
        try:
            time.sleep(1)
            print('main loop')
        except KeyboardInterrupt:
             run = False
             print('main loop FIN')    
             break

def fn_start():
    global run
    if run:
        print('Click')
        s_timer()
    else:
        print('timer FIN')
        return    

def s_timer():
    t = threading.Timer(5.0, fn_start)
    t.start()



s_timer()
main_loop()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...