python通过鼠标键盘监听自动桌面截图调用百度文字识别工具

垃圾代码,没有优化,重点是能直接运行,修改也方便

 


from pynput import mouse,keyboard
from collections import deque
import threading,time,os,sys
# 导入需要的模块
from aip import AipOcr
import tkinter as tk
import pyautogui
from PIL import Image
# 导入pynput模块中的mouse模块
from tkinter import messagebox
import pyperclip
from tkinter import ttk
import tkinter.messagebox as msgbox
import tkinter.filedialog as filedialog
from tkinter import filedialog
from pynput.mouse import Controller
from threading import Thread
import win32clipboard

from io import BytesIO
# 调用百度识别文字,请在此输入账号
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''

'''

1.说明:
    1.0.tcy shanghai 2018/8/28 测试平台windows7 python3.7 pycharm20182.1
    1.1. 一个鼠标监听器是一个线程。所有的回调将从线程调用。
    1.2. 任何地方调用pynput.mouse.Listener.stop,mouse.Listener.StopException
          或从回调中返回False来停止监听器。
2.用途:
    1.1.本函数主要用作鼠标监听
    1.2.实现鼠标监听暂停启动停止;停止和销毁后不能再进行鼠标监听,暂停后可 
3.技术要点
    1.1.采用鼠标监听内部的线程挂起,当暂停时鼠标不起左右,恢复后又正常工作。
'''

'''
这段代码定义了一个名为MouseClass的类,该类继承自threading.Thread。该类有三个方法:on_move、on_click和on_scroll,分别是鼠标移动、鼠标点击和鼠标滚动的事件处理程序。

run方法启动一个mouse.Listener,监听鼠标事件并调用相应的事件处理程序。mouse_pause方法设置一个标志来暂停鼠标线程,mouse_resume方法设置标志来恢复线程。

总的来说,这段代码提供了一种监听鼠标事件并暂停/恢复监听线程的方法。
'''
class MouseClass1(threading.Thread):
    def __init__(self, *args, **kwargs):
        
        super(MouseClass1, self).__init__(*args, **kwargs)
        self.mouse_listion=mouse.Listener()
        self.__mouse_run_flag_=True                 # 用于暂停鼠标线程不挂起
        self.__mouse_destroy_flag_=True             #True鼠标监听不退出
    def on_move(self,x, y ):
        print("Pointer moved to {0}  {1}".format((x,y),time.ctime()))
        if not self.__mouse_destroy_flag_:            #false鼠标监听停止
            return False                              #  注意:不要返回True,否则不能够暂停等功能
    def on_click(self,x, y , button, pressed):
        print('{0} at{1}'.format('Pressed' if pressed else 'Released',(x, y)))
        #凸轮键松开鼠标监控停止
        if pressed:
            self.按下触发(x,y)
        else:
            self.弹起触发(x,y)
        
        if (not self.__mouse_destroy_flag_) or (not pressed): #false鼠标监听停
            return False
    def on_scroll(self,x, y ,dx, dy):
        print('Scrolled {0} at {1}'.format( 'down' if dy <0 else 'up',(x, y)))
        if not self.__mouse_destroy_flag_:                  #false鼠标监听停止
            return False
    def run(self):
        while 1:
            with  mouse.Listener( no_move = self.on_move,on_click = self.on_click,on_scroll = self.on_scroll,
                                suppress=not self.__mouse_run_flag_) as  self.mouse_listion:
                self.mouse_listion.join()
                if not self.__mouse_destroy_flag_:
                    break
    def mouse_pause(self):
        self.__mouse_run_flag_ = False
        print('鼠标暂停...;当前线程==>%s ;线程数量==%d\n' % (
            threading.current_thread().name, threading.activeCount()))
    def mouse_resume(self):
        self.__mouse_run_flag_=True
        print('鼠标恢复...;当前线程==>%s ;线程数量==%d\n' % (
                threading.current_thread().name, threading.activeCount()))
    def mouse_destroy(self):
        self.__mouse_destroy_flag_=False   # 鼠标监听停止
        self.__mouse_run_flag_ = True
        # print('鼠标监听停止;当前线程==>%s ;线程数量==%d\n' %(
                # threading.current_thread().name, threading.activeCount()))
    
    
                
    def 截屏裁剪(self,zb):
        img = Image.open("screenshot4.png")
        try:
            if zb[0][0]!=zb[1][0] and  zb[0][1]!= zb[1][1]: 
                if zb[1][0] > zb[0][0]:
                    cropped = img.crop((zb[0][0], zb[0][1], zb[1][0], zb[1][1])) # (left, upper, right, lower)
                else:
                    cropped = img.crop((zb[1][0], zb[1][1], zb[0][0], zb[0][1])) # (left, upper, right, lower)
                    
                
                cropped.save("screenshot1.png")
                            # 获取桌面路径
                desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
            
                # 保存截屏图片到桌面
                cropped.save(desktop_path+r"\screenshot1.png")
                print('裁剪成功。')

                # 截屏裁剪信号
                # with open("截屏裁剪信号.txt", "w") as f:
                #     f.write("1")
                
                # 关闭画图软件
                os.system("taskkill /f /im mspaint.exe")
                os.system(r'screenshot1.png')
                
                



        finally:
            print("错误执行")
            # msgbox.showinfo("提示", "截屏成功!")
    


    def 按下触发(self,x,y):
        global zb1
            # 鼠标点击时触发
        zb2=[]
        print('鼠标按下在 ({0}, {1})'.format(x, y))
        zb1=[x,y]
        # print(zb1)
    def 弹起触发(self,x,y):
        print('鼠标弹起在 ({0}, {1})'.format(x, y))
        # print(x, y)
        zb2=[x,y]
        # print(zb2)
        zb=[zb1,zb2]    
        print(zb)
        if zb[0][0]!=zb[1][0] and  zb[0][1]!= zb[1][1]: 
            self.截屏裁剪(zb)
            self.mouse_destroy()



            
class MouseClass(threading.Thread):
    def __init__(self, *args, **kwargs):
        super(MouseClass, self).__init__(*args, **kwargs)
        self.mouse_listion=mouse.Listener()
        self.__mouse_run_flag_=True                 # 用于暂停鼠标线程不挂起
        self.__mouse_destroy_flag_=True             #True鼠标监听不退出
    def on_move(self,x, y ):
        print("Pointer moved to {0}  {1}".format((x,y),time.ctime()))
        if not self.__mouse_destroy_flag_:            #false鼠标监听停止
            return False                              #  注意:不要返回True,否则不能够暂停等功能
    def on_click(self,x, y , button, pressed):
        print('{0} at{1}'.format('Pressed' if pressed else 'Released',(x, y)))
        #凸轮键松开鼠标监控停止
        if pressed:
            self.按下触发(x,y)
        else:
            self.弹起触发(x,y)
        
        if (not self.__mouse_destroy_flag_) or (not pressed): #false鼠标监听停
            return False
    def on_scroll(self,x, y ,dx, dy):
        print('Scrolled {0} at {1}'.format( 'down' if dy <0 else 'up',(x, y)))
        if not self.__mouse_destroy_flag_:                  #false鼠标监听停止
            return False
    def run(self):
        while 1:
            with  mouse.Listener( no_move = self.on_move,on_click = self.on_click,on_scroll = self.on_scroll,
                                suppress=not self.__mouse_run_flag_) as  self.mouse_listion:
                self.mouse_listion.join()
                if not self.__mouse_destroy_flag_:
                    break
    def mouse_pause(self):
        self.__mouse_run_flag_ = False
        print('鼠标暂停...;当前线程==>%s ;线程数量==%d\n' % (
            threading.current_thread().name, threading.activeCount()))
    def mouse_resume(self):
        self.__mouse_run_flag_=True
        print('鼠标恢复...;当前线程==>%s ;线程数量==%d\n' % (
                threading.current_thread().name, threading.activeCount()))
    def mouse_destroy(self):
        self.__mouse_destroy_flag_=False   # 鼠标监听停止
        self.__mouse_run_flag_ = True
        print('鼠标监听停止;当前线程==>%s ;线程数量==%d\n' %(
                threading.current_thread().name, threading.activeCount()))
    
    
    def 截屏裁剪(self,zb):
        # 获取屏幕尺寸
        screen_width, screen_height = pyautogui.size()
        # 截屏
        screenshot = pyautogui.screenshot()
            # 剪切图片
        screenshot.save('screenshot.png')
        img = Image.open("screenshot.png")
        print('截屏成功。')
        # print(img.size)
        try:
            if zb[0][0]!=zb[1][0] and  zb[0][1]!= zb[1][1]: 
                if zb[1][0] > zb[0][0]:
                    cropped = img.crop((zb[0][0], zb[0][1], zb[1][0], zb[1][1])) # (left, upper, right, lower)
                else:
                    cropped = img.crop((zb[1][0], zb[1][1], zb[0][0], zb[0][1])) # (left, upper, right, lower)
                    
                
                cropped.save("screenshot1.png")
                print('裁剪成功。')
                # text=调用百度识别文字('screenshot1.png')
                # pyperclip.copy(text)
        finally:
            print("错误执行")
            # msgbox.showinfo("提示", "截屏成功!")
    def 调用百度识别文字(self,图片):
        # pip install baidu-aip
        # pip install chardet
        # 如果安装后还是无法解决问题,可以尝试更新pip并重新安装:
        # pip install --upgrade pip
        # pip install chardet
        # from aip import AipOcr
        # 配置好百度AI开放平台

        client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

        # 读取图片
        def get_file_content(filePath):
            with open(filePath, 'rb') as fp:
                return fp.read()
        # 定义参数变量
        options = {
            'detect_direction': 'true',
            'language_type': 'CHN_ENG',
        }
        # 调用通用文字识别接口
        result = client.basicGeneral(get_file_content(图片), options)
        # print(result)

        # 提取所有words的值,并用回车键连接
        words = '\n'.join([item['words'] for item in result['words_result']])
        # 输出结果
        print(words)
        return words
        # 调用百度识别文字('2.png')
        # zb=[[0,0],[1000,1000]]
    def 按下触发(self,x,y):
        global zb1
            # 鼠标点击时触发
        zb2=[]
        print('鼠标按下在 ({0}, {1})'.format(x, y))
        zb1=[x,y]
        # print(zb1)
    def 弹起触发(self,x,y):
        print('鼠标弹起在 ({0}, {1})'.format(x, y))
        # print(x, y)
        zb2=[x,y]
        # print(zb2)
        zb=[zb1,zb2]    
        print(zb)
        if zb[0][0]!=zb[1][0] and  zb[0][1]!= zb[1][1]: 
            self.截屏裁剪(zb)
            self.mouse_destroy()
            time.sleep(0.2)
            text=''
            text=self.调用百度识别文字('screenshot1.png')
            # text='查看状态:未查看。识别结果为:\n'+text
            with open('文字识别结果.txt', 'w') as f:
                f.write(text)

            # 关闭文件
            f.close()
            # 文字显示在输入框
            # input_entry.insert(0, text)
            # msgbox.showinfo("提示", "截屏成功!")

def 截屏裁剪(zb):
    # 获取屏幕尺寸
    screen_width, screen_height = pyautogui.size()
    # 截屏
    screenshot = pyautogui.screenshot()
        # 剪切图片
    screenshot.save('screenshot.png')
    img = Image.open("screenshot.png")
    print('截屏成功。')
    print(zb)
    try:
        if zb[0][0]!=zb[1][0] and  zb[0][1]!= zb[1][1]: 
            if zb[1][0] > zb[0][0]:
                cropped = img.crop((zb[0][0], zb[0][1], zb[1][0], zb[1][1])) # (left, upper, right, lower)
            else:
                cropped = img.crop((zb[1][0], zb[1][1], zb[0][0], zb[0][1])) # (left, upper, right, lower)
                
            
            cropped.save("screenshot1.png")
            print('裁剪成功。')
            text=调用百度识别文字('screenshot1.png')
            pyperclip.copy(text)
    finally:
        print("错误执行")
        # msgbox.showinfo("提示", "截屏成功!")
def 调用百度识别文字(图片):
    # pip install baidu-aip
    # pip install chardet
    # 如果安装后还是无法解决问题,可以尝试更新pip并重新安装:
    # pip install --upgrade pip
    # pip install chardet
    # from aip import AipOcr
    # 配置好百度AI开放平台


    client = AipOcr(APP_ID, API_KEY, SECRET_KEY)

    # 读取图片
    def get_file_content(filePath):
        with open(filePath, 'rb') as fp:
            return fp.read()
    # 定义参数变量
    options = {
        'detect_direction': 'true',
        'language_type': 'CHN_ENG',
    }
    # 调用通用文字识别接口
    result = client.basicGeneral(get_file_content(图片), options)
    # print(result)

    # 提取所有words的值,并用回车键连接
    words = '\n'.join([item['words'] for item in result['words_result']])
    # 输出结果
    print(words)
    return words
    # 调用百度识别文字('2.png')
    # zb=[[0,0],[1000,1000]]

def 键盘监听(坐标1执行,坐标2执行):
    # mouse = Controller()
    def on_press(key):
        if key == keyboard.Key.shift:
            坐标1执行()
        elif key == keyboard.Key.caps_lock:
            坐标2执行()
            # print("退出键盘监听")
            listener.stop()

    def on_release(key):
        pass
    # 创建键盘监听器并注册按下和释放事件的回调函数
    with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
        listener.join()
# 键盘监听()         
def mouse_test1():
        # 启动监控器。
        km1=MouseClass1()
        # print(功能选择)

        km1.start()
        
def mouse_test():
        # 启动监控器。
        km=MouseClass()
        # print('1.Start runing...')
        km.start()
def ui():
        # 创建UI
        root = tk.Tk()
        root.title("截屏工具")
        # root.geometry("400x300")
        # 将窗口设置为始终置顶
        root.attributes("-topmost", True)

        # 创建输入框
        input_frame = ttk.Frame(root)
        input_frame.pack(pady=10)
        input_label = ttk.Label(input_frame, text="输入框:")
        input_label.pack(side="left")
        input_entry = ttk.Entry(input_frame, width=30)
        input_entry.pack(side="left")
            
        def 键盘操作():
            # 调用记事本程序打开文本文件
            def 坐标1执行():
                global zb1
            # 鼠标点击时触发
                zb2=[]
                mouse = Controller()
                zb1 = mouse.position
                zb1=[zb1[0],zb1[1]]
                # print(zb1[1],'坐标1执行',zb1[0],)
                print('鼠标按下在 ({0}, {1})'.format(zb1[0],zb1[1]))
            def 坐标2执行():
                
                # ---------------------
                mouse = Controller()
                zb2 = mouse.position
                x=zb2[0]
                y=zb2[1]
                # print(zb1[1],'坐标1执行',zb1[0],)
                zb2=[x,y]
                # print(zb2)
                zb=[zb1,zb2]    
                # print(zb)
                print('鼠标按下在 ({0}, {1})'.format(x,y))
                print("退出键盘监听")
                if zb[0][0]!=zb[1][0] and  zb[0][1]!= zb[1][1]: 
                    # 截屏裁剪(zb)






                    # 截屏
                    screenshot = pyautogui.screenshot()
                        # 剪切图片
                    screenshot.save('screenshot.png')
                    img = Image.open("screenshot.png")
                    print('截屏成功。')
                    print(zb)
                    try:
                        if zb[0][0]!=zb[1][0] and  zb[0][1]!= zb[1][1]: 
                            if zb[1][0] > zb[0][0]:
                                cropped = img.crop((zb[0][0], zb[0][1], zb[1][0], zb[1][1])) # (left, upper, right, lower)
                            else:
                                cropped = img.crop((zb[1][0], zb[1][1], zb[0][0], zb[0][1])) # (left, upper, right, lower)
                                
                            
                            cropped.save("screenshot1.png")
                            print('裁剪成功。')
                            text=调用百度识别文字('screenshot1.png')
                            pyperclip.copy(text)
                    finally:
                        print("错误执行")
                        # msgbox.showinfo("提示", "截屏成功!")























                    time.sleep(0.2)
                    text=''
                    text=调用百度识别文字('screenshot1.png')
                    # text='查看状态:未查看。识别结果为:\n'+text
                    with open('文字识别结果.txt', 'w') as f:
                        f.write(text)

                    # 关闭文件
                    f.close()
            
            # -----------------------------------
            
            
            
            
            
            
            
            def threadFunc():
                
                with open('文字识别结果.txt', 'w') as f:
                    f.write('')   

                键盘监听(坐标1执行,坐标2执行)
                for i in range(60):
                    time.sleep(0.5)
                    # 循环体代码
                    
                    # 打开文件并逐行读取内容
                    f = open('文字识别结果.txt', 'r')
                    text = f.read()
                    f.close()
                    if text!='' :
                        input_entry.delete(0, tk.END)
                        input_entry.insert(0, text)
                        # print("耗时:", i*0.5)
                        tsh="识别完成!耗时:"+str(i*0.5)+'秒'

                        msgbox.showinfo("提示",tsh )
                        break
                
            thread = Thread(target=threadFunc)
            thread.start()

        save_button = ttk.Button(root, text="键盘选取", command=键盘操作)
        save_button.pack(pady=10)



        # 鼠标选取
        def start():
            # 功能选择='文字识别'
            with open('文字识别结果.txt', 'w') as f:
                f.write('')         

            mouse_test() 
            for i in range(60):
                time.sleep(0.5)
                # 循环体代码
                
                # 打开文件并逐行读取内容
                f = open('文字识别结果.txt', 'r')
                text = f.read()
                f.close()
                if text!='' :
                    input_entry.delete(0, tk.END)
                    input_entry.insert(0, text)
                    # print("耗时:", i*0.5)
                    tsh="识别完成!耗时:"+str(i*0.5)+'秒'

                    msgbox.showinfo("提示",tsh )
                    break
        
        start_button = ttk.Button(root, text="鼠标选取", command= start)
        start_button.pack(pady=10)

        # 创建复制按钮
        def copy():
            # 把输入框的文字设置为剪切板内容
            root.clipboard_clear()
            root.clipboard_append(input_entry.get())
            msgbox.showinfo("提示", "复制成功!")

        copy_button = ttk.Button(root, text="复制", command=copy)
        copy_button.pack(pady=10)

        # 创建保存按钮
        def save():
            def print_message1():
                # 调用记事本程序打开文本文件
                os.system('notepad.exe 文字识别结果.txt')
            thread1 = threading.Thread(target=print_message1)
            thread1.start()
            # thread1.join()


        save_button = ttk.Button(root, text="文字查看", command=save)
        save_button.pack(pady=10)


        def jp():
            # 等待3秒
            # time.sleep(1)
            # 截屏
            screenshot = pyautogui.screenshot()
            # 获取桌面路径
            desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
            screenshot.save("screenshot.png")
            # 保存截屏图片到桌面
            screenshot.save(desktop_path+r"\screenshot.png")
            # 文字显示在输入框
            input_entry.delete(0, tk.END)
            input_entry.insert(0, "截屏成功并保存到桌面!")
            msgbox.showinfo("提示", "截屏成功并保存到桌面!")

        save_button = ttk.Button(root, text="截屏保存", command=jp)
        save_button.pack(pady=10)
        
        def 查看截屏():
            # C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\
            
            
            
            # from time import sleep

            def threadFunc():
                # 调用第三方图片编辑软件打开图片
                os.system(r'%windir%\system32\mspaint.exe screenshot.png')
            
                # print('子线程 结束')

            thread = Thread(target=threadFunc)
            thread.start()

        def 裁剪截屏():
            # 打开截屏图片
            查看截屏()
            time.sleep(2)
            screenshot = pyautogui.screenshot()
            # 获取桌面路径
            desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")

            截屏处理图片="screenshot4.png"
            screenshot.save(截屏处理图片)
            mouse_test1()

        save_button2 = ttk.Button(root, text="裁剪截屏", command=裁剪截屏)
        save_button2.pack(pady=10)

        # 创建查看按钮
        def 截屏裁剪():
            screenshot = pyautogui.screenshot()
            # 获取桌面路径
            desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
            screenshot.save("screenshot.png")
            # 保存截屏图片到桌面
            screenshot.save(desktop_path+r"\screenshot.png")
            裁剪截屏()
            

        save_button = ttk.Button(root, text="截屏裁剪", command=截屏裁剪)
        save_button.pack(pady=10)


        # 创建查看按钮
        def 查看截图():
            # C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\
            
            
            from threading import Thread
            # from time import sleep

            def threadFunc():
                # 调用第三方图片编辑软件打开图片
                os.system(r'%windir%\system32\mspaint.exe screenshot1.png')
            
                # print('子线程 结束')

            thread = Thread(target=threadFunc)
            thread.start()
        save_button = ttk.Button(root, text="查看截图", command=查看截图)
        save_button.pack(pady=10)
        
        save_button = ttk.Button(root, text="查看截屏", command=查看截屏)
        save_button.pack(pady=10)

                # 创建查看按钮
        def 打开截图工具():
            # C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\
            
            
            from threading import Thread
            # from time import sleep

            def threadFunc():
                # 调用第三方图片编辑软件打开图片
                os.system(r'%windir%\system32\SnippingTool.exe')
            
                # print('子线程 结束')

            thread = Thread(target=threadFunc)
            thread.start()
        save_button = ttk.Button(root, text="打开截图", command=打开截图工具)
        save_button.pack(pady=10)
























        # 定义按钮点击事件
        def 使用方法():
            使用方法提示='''
键盘选取:
屏鼠标移到屏幕的左上角,按'shift'键,获取识别范围的起点。
鼠标一下,屏幕的右下角按'caps lock'键(字母大小写转换键),选取识别范围的终点,等待得到结果。
鼠标选取。直接拖动鼠标选范围。
'''
            messagebox.showinfo("提示", 使用方法提示)

        # 创建按钮
        button9 = tk.Button(root, text="使用方法", command=使用方法)

        # 将按钮添加到主窗口
        button9.pack()
        
        root.mainloop()


def main():
    #运行模拟器
    
    ui()
main()


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值