Time.Sleep 替代方案?需要能够打破循环/返回主

问题描述

import time
import pyautogui
from pyautogui import *
import keyboard
from PIL import ImageGrab,Image
from PIL import *
import os
import win32api,win32con
import cv2
import pyperclip
from pynput.keyboard import Key,Listener
import PyTesseract
import numpy as np
from numpy import *
from threading import Event

##1340,182,1777,213
test = 0
src_path = os.getcwd()
PyTesseract.PyTesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract'


def get_region(Box):
    im = ImageGrab.grab(Box)
    im = im.save(os.getcwd() + "\\logs.png",'PNG')

def get_string(img_path):
    img = cv2.imread(img_path)
    kernel = np.ones((1,1),np.uint8)
    img = cv2.dilate(img,kernel,iterations=1)
    img = cv2.erode(img,iterations=1)
    red   = [0,255]
    img[img != red] = 255
    cv2.imwrite(src_path + "\\logs.png",img)
    result = PyTesseract.image_to_string(Image.open(src_path + "\\logs.png"))
    return result

def alertf1(c):
    global test
    time.sleep(0.1)
    while c == 1:
        if keyboard.is_pressed('f1'):  # if key 'f1' is pressed 
            print('f1 has been pressed')
            c = 0
            break
        else:
            result = get_string(src_path + "\\logs.png")
            print('checking if anything is destroyed')
            if result.find('destroved') != -1:
                print('something got destroyed!')
                pyautogui.keyDown('ctrl')
                time.sleep(0.1)
                pyautogui.keyDown('tab')
                pyautogui.keyUp('ctrl')
                pyautogui.keyUp('tab')
                time.sleep(0.5)
                for char in '@':
                    pyperclip.copy(char)
                    pyautogui.hotkey('ctrl','v',interval=0.1)
                    pyautogui.write('everyone Enemies/Red Logs! Something has been destroyed.')
                    pyautogui.press('enter')
                    pyautogui.click(x=1860,y=50)
            else:
                if keyboard.is_pressed('f1'):  # if key 'f1' is pressed 
                    print('f1 has been pressed')
                    c = 0
                    break

def on_press(key):
    global test
    test = test + 1
    region = (1341,185,1778,215)
    get_region(region)
    if key == Key.f1 and test == 1:
        print('before alert f1 pressed')
        test = test + 1
        time.sleep(0.1)
        alertf1(1)
    if key == Key.f1 and test == 3:
        test = 0



with Listener(on_press=on_press) as listener:
    listener.join()

def main():
    while True:
        print('on press going Now')
        on_press(key)


if __name__ == '__main__':
    main()

这是我当前的代码,对它的作用和我想要的做了一个简短的解释: 开始时,如果用户按“F1”,它将截取一小块区域的屏幕截图并将图像转换为文本,然后将运行无限循环,以检查我从图像中获得的文本是否为 = 'destroyed',如果然后用户会收到通知,如果不是,它将无限循环获取新的屏幕截图并再次检查。

我还添加了“if keyboard.is_pressed('f1'):”来打破无限循环。

我现在遇到的两个问题:

1- 用户收到通知后,我希望程序不要进入无限循环 5 分钟,time.sleep (300) 有效,但问题是如果用户想取消当前功能并按 F1 中断循环回到 Main() 它不会被检测到,因此我需要另一个 time.sleep 替代方法,因为它只是完全冻结代码。我听说 threading.event 可以工作,但老实说我不知道​​它是如何工作的,即使在检查了几个例子之后,我也不知道如何让它仍然工作。

2- 我发现 'if keyboard.is_pressed('f1'):' 不是很有效,因为它有时不会触发并且必须多次点击直到它触发并中断循环。什么是好的选择?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)