0

希望您对我正在努力克服的问题提出意见和支持。这将是完成我正在建设的一个小项目的最后一块拼图。它基于OCR。我正在从实时屏幕读取文本(使用下面的 python 脚本)并能够将结果记录到文件中。但是,只有在我使用 alt+tab 使 python 控制台窗口(脚本在其中打印输出)处于活动状态/通过键盘聚焦时,才会记录输出。

但是这样做会停止我正在阅读文本的软件,从而破坏了整个过程。将窗口切换到软件的前面是脚本目的失败。

因此,在从其他用户那里搜索关于始终将 python 控制台窗口保持在顶部的代码后,我添加了代码,无论软件在做什么。我无法将此 python 控制台窗口保留在此 sw 屏幕的顶部。SW 将所有屏幕用于其工作目的。

有没有替代方案?无论屏幕上有什么,我怎样才能让 python 控制台成为任何其他窗口的顶部?如果不是这个,请提出一个替代方案。

import numpy as nm
from datetime import datetime
import pytesseract
import cv2
import PIL
from PIL import ImageGrab
import win32gui, win32process, win32con
import os

hwnd = win32gui.GetForegroundWindow()
win32gui.SetWindowPos(hwnd,win32con.HWND_TOPMOST,0,0,100,300,0) 

#Define function for OCR to enable on multiple screens. 
def imToString(): 

    # Path of tesseract executable
    pytesseract.pytesseract.tesseract_cmd ='C:\\Tesseract-OCR\\tesseract.exe'
    while(True):


        # ImageGrab-To capture the screen image in a loop.
        # Bbox used to capture a specific area.

        #screen base
        cap1 = PIL.ImageGrab.grab(bbox =(0, 917, 1913, 1065), include_layered_windows=False, all_screens=True)
        date = datetime.now().strftime("%Y-%m-%d %I:%M:%S")    
        #str config - OCR Engine settings for ONLY text based capture.
        config1 = ('-l eng --oem 2 --psm 6')


        #configuring tesseract engine for OCR 
        tess1 = pytesseract.image_to_string(
                cv2.cvtColor(nm.array(cap1), cv2.COLOR_BGR2GRAY),
                config=config1)
    

        #Defining log pattern to generate
        a = [ date, " State: ", tess1 ]


        #writing logging output to file
        file1 = open("C:\\Users\\User\\Desktop\\rev2.log", "a", encoding='UTF8')
        file1.writelines(a)
        file1.writelines("\n")
        file1.close()                                       

        #OUTPUT on colse for Logging verification
        print (date, "State: ", tess1)  
                                



 # Calling the function
imToString()

根据要求,我不允许在操作屏幕时使用键盘。我对python相当陌生,并且一直在看到类似的解决方案并将其添加到脚本中以制定适当的解决方案。

请指教。

4

1 回答 1

0

这是tkinter方法:

from tkinter import Tk, Text
import subprocess
import threading
from queue import Queue, Empty


filename = 'test.py'


def stream_from(queue):
    command = f'python {filename}'
    with subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as process:
        for out in process.stdout:
            queue.put(out.decode())


def update_text(queue):
    try:
        data = queue.get(block=False)
    except Empty:
        pass
    else:
        text.config(state='normal')
        text.insert('end', data.strip() + '\n')
        text.config(state='disabled')
    finally:
        root.after(100, update_text, queue)


def loop():
    root.attributes('-topmost', True)
    root.after(1, loop)


root = Tk()


text = Text(root, state='disabled')
text.pack()

data_queue = Queue()
threading.Thread(target=stream_from, args=(data_queue, ), daemon=True).start()
update_text(data_queue)

loop()

root.mainloop()

只需将 更改为filename您正在运行的文件的名称并将此脚本放在同一目录中
更改delay_in_ms(以毫秒为单位延迟,因此每 1000 个单位为一秒),看看是否有帮助(也可以留出 10 秒,看看它是否有效现在,如果没有,还有另一件事要尝试)

如果您print用于输出,那么这应该可以工作(虽然我可能没有完全得到您想要的),如果您使用,logging那么有一个稍微不同的解决方案

于 2021-08-13T13:41:29.953 回答