自动打字神器:用Python解放你的双手!

大家好呀!今天给大家带来一个超级实用的小工具——自动打字神器!你有没有遇到过这样的场景:需要把屏幕上的文字复制下来,但又不想手动一个字一个字地敲?或者在做数据录入的时候,手都快抽筋了?别担心,我最近发现了一个用Python编写的神奇代码,它可以帮你轻松解决这些问题,简直就是打字界的“救星”!

这个代码的核心功能是通过屏幕截图和光学字符识别(OCR)技术,把屏幕上的文字自动转换成键盘输入。听起来是不是很神奇?接下来,我就带大家深入了解一下这个代码的奥秘,看看它是怎么实现这个功能的。

核心代码解析

首先,我们来看看代码的核心部分——AutoTyper类。这个类就像是一个指挥官,控制着整个自动打字的过程。

class AutoTyper:
    clickCount = 0  # 记录点击次数
    pCords = [0, 0, 0, 0]  # 保存截图区域的坐标
    defined = False  # 标记是否已经定义了截图区域
    pImage = None  # 保存截图的图像

这里定义了一些基本的变量,用来记录用户操作的状态。比如clickCount用来记录用户点击屏幕的次数,pCords用来保存截图区域的坐标。

接下来是area_select方法,这个方法允许用户通过鼠标点击来定义截图区域。

def area_select():
    print('Click twice to define TEXT window')  # 提示用户点击两次定义区域

    def on_click(x, y, button, pressed):
        if pressed:  # 如果鼠标按下
            print('({0}, {1})'.format(x, y))  # 打印点击的坐标
            if AutoTyper.clickCount == 0:  # 第一次点击
                AutoTyper.pCords[0] = x
                AutoTyper.pCords[1] = y
            elif AutoTyper.clickCount == 1:  # 第二次点击
                AutoTyper.pCords[2] = x
                AutoTyper.pCords[3] = y
                AutoTyper.defined = True  # 标记区域已定义
                print('')
                AutoTyper.clickCount = 0  # 重置点击次数
                return False
            AutoTyper.clickCount += 1

    with ms.Listener(on_click=on_click) as listener:  # 监听鼠标点击
        listener.join()

这个方法通过监听鼠标事件,让用户可以通过点击两次来定义一个矩形区域。第一次点击记录左上角坐标,第二次点击记录右下角坐标。

然后是capture方法,它负责截取用户定义的屏幕区域并保存为图像。

def capture():
    if AutoTyper.defined:  # 如果已经定义了区域
        AutoTyper.pImage = ImageGrab.grab(bbox=(AutoTyper.pCords[0],  # 截取定义的区域
                                                AutoTyper.pCords[1],
                                                AutoTyper.pCords[2],
                                                AutoTyper.pCords[3]))
    else:
        print('please define an area to OCR before trying to print')  # 提示用户先定义区域

这里使用了ImageGrab模块来截取屏幕上的图像,并保存到pImage变量中。

最后是output方法,它将OCR识别到的文字通过键盘模拟输入到目标位置。

def output(delaytime: float):
    try:
        paraString = pytesseract.image_to_string(AutoTyper.pImage)  # OCR识别图像中的文字
    except SystemError:
        print('\n Error while processing your image, please retry.')  # 如果出错,提示用户
        return False

    length = len(paraString)  # 获取文字长度
    for i in range(length):  # 模拟键盘输入每个字符
        keyboard.press(paraString[i])
        keyboard.release(paraString[i])
        time.sleep(delaytime)  # 每次输入之间延迟一段时间

这个方法通过pytesseract库将图像中的文字识别出来,然后使用keyboard库模拟键盘输入,把文字输入到目标位置。

基于代码的扩展应用

这个代码本身已经很实用了,但我们可以在此基础上进行扩展,让它在更多场景下发挥作用。比如:

场景一:批量录入数据

假设你有一堆表格数据需要录入到一个系统中,手动输入太麻烦了。我们可以扩展代码,让它能够批量处理多个截图区域的文字并输入。

class BatchAutoTyper(AutoTyper):
    regions = []  # 保存多个截图区域的坐标

    def add_region(self):
        print('Click twice to add a TEXT window')
        self.area_select()
        self.regions.append(self.pCords)  # 将定义的区域坐标保存起来

    def batch_capture_and_output(self, delaytime: float):
        for region in self.regions:  # 遍历所有定义的区域
            self.pCords = region  # 设置当前区域
            self.capture()  # 截取图像
            self.output(delaytime)  # 输出文字

在这个扩展中,我们增加了一个regions列表来保存多个截图区域的坐标,并通过add_region方法让用户可以添加多个区域。然后通过batch_capture_and_output方法依次处理每个区域的文字并输入。

场景二:实时翻译输入

如果你在看外文资料,想把屏幕上的文字翻译后输入到翻译软件中,我们可以结合翻译API来实现这个功能。

import requests

class TranslatorAutoTyper(AutoTyper):
    def translate_and_output(self, delaytime: float, target_lang='zh'):
        self.capture()  # 截取图像
        try:
            paraString = pytesseract.image_to_string(self.pImage)  # OCR识别文字
        except SystemError:
            print('\n Error while processing your image, please retry.')
            return False

        # 调用翻译API
        url = "https://api.mymemory.translated.net/get?q={}&langpair=en|{}".format(paraString, target_lang)
        response = requests.get(url)
        if response.status_code == 200:
            translated_text = response.json()['responseData']['translatedText']
            length = len(translated_text)
            for i in range(length):  # 模拟键盘输入翻译后的文字
                keyboard.press(translated_text[i])
                keyboard.release(translated_text[i])
                time.sleep(delaytime)
        else:
            print('Translation failed')

在这个扩展中,我们通过调用一个在线翻译API,将OCR识别到的文字翻译成目标语言,然后模拟键盘输入翻译后的文字。

总结

这个自动打字神器的代码真是太有用了!它不仅可以帮助我们快速将屏幕上的文字转换成键盘输入,还可以通过扩展应用到更多场景,比如批量数据录入和实时翻译输入。有了这个工具,再也不用手动一个字一个字地敲了,简直是打字界的福音!

需要完整的源码,请在评论区留言,或私信我。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐