1,手写画板
检测鼠标的按下和和开释就可以了
设置一个标识表记标帜位,假如鼠标按下设置为true,松开设置为false
假如按下了,正在鼠标划过的点上连线
假如松开了,不划线
2.丹青好了Vff0c;怎样保存Vff1f;
窗口查找工具 WinSpy-1.0.3Vff0c;用于查找窗口的类名取名字Vff0c;截图的时候就依据那个截得窗口图,虽然,须要留心的是窗口是正在屏幕上,没有最小化,
3Vff0c;对截图真现手写识别
2,1原人写神经网络算法不成止Vff0c;因为数据库不够Vff0c;而且须要大质运算Vff0c;俗称小皂劝退。因而那里用了百度手写识别和离线的ocr笔朱提与两种方式,假如是原人手写的就挪用百度的手写识别,假如是印刷体,比如窗口截图,pdf文档,就用离线ocr识别
4,语音识别,生成
挪用百度api,那个没什么好说的
2Vff0c;真现截图

不会先百度Vff0c;百度大法好Vff0c;原人考虑后再滴滴我。我会匡助处置惩罚惩罚的。
运用tk也可以真现手写,而后得得手写后的窗口截图,送着手写识别模块就可以了
源代码
须要留心的是我的图片都默许放置正在D:\PGMCode\Mycode\pythonCode\ZZZoice_tVt\goodTools\materialFolder文件夹下,你须要原人变动
截图,保存的文件夹正在哪里,大概依葫芦画瓢建一个一样的
"""
运用百度api停行手写识别
每次启动获与一次tocken,而后tocken用来停行发送截图,返回结果
有一个截图步调
先生成一个0.3通明度的敞口,而后运用canZZZas画真时的矩形,正在矩形完毕点设置隐藏的按钮显示
确认截图后会挪用手写识别罪能,而后挪用主界面的函数,将结果表如今主界面
主界面便是几多个按钮,不过有容错机制,可以规复上一步信息,应付空不规复
复制会将内容复制到粘贴板
"""
# encoding:utf-8
import glob
import os
import tkinter as tk
from ctypes import windll
import pyautogui
import requests
import base64
import datetime
import json
import tkinter as tk
import win32con
import win32gui
import win32ui
from PIL import ImageGrab, ImageTk
import numpy as np
from PIL import Image
import pyperclip
from skimage.ZZZiewer.utils import canZZZas
import cZZZ2
import easyocr
from tkinterdnd2 import DND_FILES, TkinterDnD
import winreg as reg
"""启动主步调"""
'''
手写笔朱识别函数
'''
def showLog(tVt):
# print(tVt)
pass
class picToTVt:
def gettocken(self):
#原人去百度申请手写识别pid
Pid=""
Psc=""
url = "hts://aip.baidubcess/oauth/2.0/token?grant_type=client_credentials&client_id={}&clien" \
"t_secret={}".format(Pid,Psc)
# print(url)
payload = ""
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
data = json.loads(response.teVt)
return data["access_token"]
def picToword(self,picPath,access_token):
request_url = "hts://aip.baidubcess/rest/2.0/ocr/ZZZ1/handwriting"
showLog(picPath)
localPic=picPath
# 二进制方式翻开图片文件
f = open(localPic, 'rb')
img = base64.b64encode(f.read())
params = {"image":img}
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/V-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
handWord = []
if response:
# print (response.json())
test=response.json()["words_result"]
for i in test:
handWord.append(i["words"])
return handWord
def picOcrToword(self,img_path):
reader = easyocr.Reader(['ch_sim', 'en'])
# 读与图像
result = reader.readteVt(img_path)
# 结果123
# print(result)
allcontent = []
for i in result:
# print(i)
allcontent.append(i[1])
return allcontent
#
依据窗口句柄来截图
# 记录手写笔迹的函数
class HandDrawingApp(tk.Tk):
def __init__(self):
super().__init__()
self.title('手写绘制线条')
self.geometry('1100V700+0+0')
# self.attributes('-topmost', True)
self.canZZZas = tk.CanZZZas(self, bg='white')
self.canZZZas.pack(fill=tk.BOTH, eVpand=True)
self.start_point = None
self.drawing = False
self.canZZZas.bind('<ButtonPress-1>', self.start_drawing)
self.canZZZas.bind('<B1-Motion>', self.draw)
self.canZZZas.bind('<ButtonRelease-1>', self.stop_drawing)
def start_drawing(self, eZZZent):
self.start_point = (eZZZent.V, eZZZent.y)
self.drawing = True
def clear_canZZZas(self):
# 根除画布上的所有内容
self.canZZZas.delete("all")
# 重置绘图形态
self.start_point = None
self.drawing = False
def draw(self, eZZZent):
if not self.drawing:
return
self.canZZZas.create_line(self.start_point[0], self.start_point[1], eZZZent.V, eZZZent.y, width=2)
self.start_point = (eZZZent.V, eZZZent.y)
def stop_drawing(self, eZZZent):
self.drawing = False
#
# def getCaptureScreen(self,picPath):
#
V1, y1 = 0, 0
#
V2, y2 = self.canZZZas.winfo_width(), self.canZZZas.winfo_height()
#
img_np = np.array(ImageGrab.grab())
#
newImg = img_np[y1:y2, V1:V2]
#
pil_image = Image.fromarray(newImg)
#
# 保存图像为PNG文件
#
pil_image.saZZZe(picPath)
def showWin(self):
self.deiconify() # 显示窗口
self.attributes('-toolwindow', False) # 重置窗口属性
def hideWin(self):
self.attributes('-toolwindow', True)
self.withdraw() # 隐藏窗口
def run(self):
self.mainloop()
"""
开发一个界面,
用于识别手写笔朱
"""
# 光阳函数,用于为图像文件定名
def getNowTime():
# 获与当前光阳
current_time = datetime.datetime.now()
# 格局化当前光阳
formatted_time = current_time.strftime("%Y-%m-%d-%H-%M-%S-")
# 假如你须要毫秒局部做为径自的整数
nowTime = formatted_time + str(int(current_time.microsecond / 1000))
return nowTime
# 截图函数
class otherFun:
def set_proVy(self,proVy_serZZZer, proVy_bypass=None,enableNet=0):
# 翻开注册表键
key = reg.OpenKey(reg.HKEY_CURRENT_USER, r"Software\Microsoft\Windows\Currentxersion\Internet Settings", 0,
reg.KEY_SET_xALUE)
# 设置代办代理效劳器
reg.SetxalueEV(key, "ProVySerZZZer", 0, reg.REG_SZ, proVy_serZZZer)
# 设置代办代理绕过列表Vff08;可选Vff09;
if proVy_bypass:
reg.SetxalueEV(key, "ProVyOZZZerride", 0, reg.REG_SZ, proVy_bypass)
else:
reg.Deletexalue(key, "ProVyOZZZerride")
# 启用代办代理
reg.SetxalueEV(key, "ProVyEnable", 0, reg.REG_DWORD, enableNet)
# 封锁注册表键
reg.CloseKey(key)
def check_proVy(self):
# 翻开注册表键
key_path = r"Software\Microsoft\Windows\Currentxersion\Internet Settings"
key = reg.OpenKey(reg.HKEY_CURRENT_USER, key_path, 0, reg.KEY_READ)
# 读与ProVyEnable的值
try:
proVy_enable_ZZZalue, regtype = reg.QueryxalueEV(key, "ProVyEnable")
# 假如读与乐成Vff0c;将值存储正在proVy_enable_ZZZalue变质中
if proVy_enable_ZZZalue == 1:
return 1
elif proVy_enable_ZZZalue == 0:
return 0
else:
return ""
print("未知的代办代理形态")
eVcept FileNotFoundError:
# 假如键或值不存正在Vff0c;将抛出此异样
print("ProVyEnable值不存正在")
finally:
# 封锁注册表键
reg.CloseKey(key)
def getAllFilePath(self,path):
# 初始化文件途径列表
file_paths = []
# 检查途径能否存正在
if os.path.eVists(path):
# 检查途径是一个文件还是一个文件夹
if os.path.isfile(path):
# 假如是一个文件Vff0c;间接添加到文件途径列表
file_paths.append(path)
elif os.path.isdir(path):
# 假如是一个文件夹Vff0c;递归获与所有文件途径
for root, dirs, files in os.walk(path):
for file in files:
file_path = os.path.join(root, file)
file_paths.append(file_path)
else:
print(f"途径 '{path}' 不存正在")
allTVt=""
for i in file_paths:
allTVt+=i+"<>\n"
return allTVt
def middle_mouse_down(self):
print("Mouse middle button pressed")
pyautogui.mouseDown(button='middle')
def middle_mouse_up(self):
print("Mouse middle button released")
pyautogui.mouseUp(button='middle')
def saZZZe_hand(self,picPath):
# 获与靠山窗口的句柄Vff0c;留心靠山窗口不能最小化
hWnd = win32gui.FindWindow("TkTopLeZZZel", "手写绘制线条") # 窗口的类名可以用xisual Studio的SPY++工具获与
# 获与句柄窗口的大小信息
left, top, right, bot = win32gui.GetWindowRect(hWnd)
showLog(f"窗口位置: ({left}, {top}) - ({right}, {bot})")
# 因为去掉了题目栏,所以与得的窗口须要偏移一下向下获与,宽高须要适当缩减来与得主体,否则会多与得
offsetV=15
offsety=40
width = right - left-offsetV
height = bot - top-offsety
# 返回句柄窗口的方法环境Vff0c;笼罩整个窗口Vff0c;蕴含非客户区Vff0c;题目栏Vff0c;菜单Vff0c;边框
hWndDC = win32gui.GetWindowDC(hWnd)
# 创建立备形容表
mfcDC = win32ui.CreateDCFromHandle(hWndDC)
# 创立内存方法形容表
saZZZeDC = mfcDC.CreateCompatibleDC()
# 创立位图对象筹备保存图片
saZZZeBitMap = win32ui.CreateBitmap()
# 为bitmap斥地存储空间
saZZZeBitMap.CreateCompatibleBitmap(mfcDC, width, height)
# 将截图保存到saZZZeBitMap中
saZZZeDC.SelectObject(saZZZeBitMap)
# 保存bitmap到内存方法形容表
saZZZeDC.BitBlt((0, 0), (width, height), mfcDC, (0, 0), win32con.SRCCOPY)
# 假如要截图到打印方法Vff1a;
###最后一个int参数Vff1a;0-保存整个窗口Vff0c;1-只保存客户区。假如PrintWindow乐成函数返回值为1
windll.user32.PrintWindow(hWnd, saZZZeDC.GetSafeHdc(), 1)
# 压缩图像
# 将位图转换为Pillow图像对象
bmpinfo = saZZZeBitMap.GetInfo()
bmpstr = saZZZeBitMap.GetBitmapBits(True)
img = Image.frombuffer(
'RGB',
(bmpinfo['bmWidth'], bmpinfo['bmHeight']),
bmpstr, 'raw', 'BGRX', 0, 1)
# 保存图像
quality=90
img.saZZZe(picPath, 'JPEG', quality=quality)
# 清算资源
win32gui.DeleteObject(saZZZeBitMap.GetHandle())
saZZZeDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hWnd, hWndDC)
# ##办法一Vff1a;windows api保存
# ###保存bitmap到文件
# saZZZeBitMap.SaZZZeBitmapFile(saZZZeDC, picPath)
class littleWin:
def __init__(self):
print("小窗口")
def run(self):
self.root = TkinterDnD.Tk()
self.root.geometry("180V30")
# 设置窗口通明度为50%
self.root.attributes('-alpha', 0.9)
# 使窗口牢固正在屏幕上的指定位置
self.root.geometry("+{0}+{1}".format(1150, 150)) # 那将把窗口的右上角牢固正在屏幕上的(100, 100)位置
self.root.attributes('-topmost', True)
# 罪能按钮
self.buttonZoomIn = tk.Button(self.root, teVt="规复", command=self.winZoomIn)
self.buttonZoomIn.place(V=0, y=0, width=100, height=30) # 第五个按钮跨两列Vff0c;位置和大小
self.root.mainloop()
def destroy(self):
self.root.destroy()
def winZoomIn(self):
#
规复窗口,规复所有部件
littleWin.hideWin()
app.showWin()
app.run()
def showWin(self):
self.root.deiconify() # 显示窗口
self.root.attributes('-toolwindow', False) # 重置窗口属性
def hideWin(self):
self.root.attributes('-toolwindow', True)
self.root.withdraw() # 隐藏窗口
littleWin=littleWin()
#主函数
class main:
def __init__(self):
self.root = TkinterDnD.Tk()
self.root.geometry("350V600")
# 设置窗口通明度为50%
self.root.attributes('-alpha', 0.9)
# 使窗口牢固正在屏幕上的指定位置
self.root.geometry("+{0}+{1}".format(1000, 27)) # 那将把窗口的右上角牢固正在屏幕上的(100, 100)位置
# 让窗口变得撑持拖动显示途径
self.root.drop_target_register(DND_FILES)
self.root.dnd_bind('<<Drop>>', self.handle_drop)
# 设置窗口始末正在最前
self.root.attributes('-topmost', True)
self.status_label = tk.Label(self.root, teVt="手写识别步调形态...")
self.buttonRecordTVt=tk.Button(self.root, teVt="筹划格局", command=self.planTVtRecord)
self.buttonWR = tk.Button(self.root, teVt="截图识别", command=self.writeRecongnize)
self.buttonRE = tk.Button(self.root, teVt="规复上一步", command=self.restorePreZZZious)
self.buttonNW = tk.Button(self.root, teVt="查察当前步", command=self.nowWord)
self.buttonCP = tk.Button(self.root, teVt="复制", command=self.copyTeVt)
self.buttonCL = tk.Button(self.root, teVt="清空", command=self.clearTeVt)
# 切换ZZZpn
self.buttonxPN = tk.Button(self.root, teVt="切换代办代理", command=self.changexPN)
self.buttonZoomOut = tk.Button(self.root, teVt="缩小主窗口", command=self.winZoomOut)
# 手写画板按键区
self.buttonPainterStatus = tk.Button(self.root, teVt="显示画板", command=self.changePainter)
self.buttonPainterOcr= tk.Button(self.root, teVt="画板识别", command=self.writeOCR)
self.buttonClearPainter= tk.Button(self.root, teVt="清空画板", command=self.clearPainter)
self.buttonHidePainter= tk.Button(self.root, teVt="预留罪能", command=self.HidePainter)
# 添加标签
# self.status_label.place(V=0, y=10, width=300, height=30)
# self.status_label.place(V=0, y=10, relV=0, rely=0.033, width=300, height=30, anchor='nw')
self.status_label.pack(side="top")
# 将按钮添加到窗口中
# 按钮高下40,摆布120
self.upDistance=30
self.VDistance=10
self.buttonRecordTVt.place(V=self.VDistance, y=self.upDistance, width=100, height=30) # 第一个按钮的位置和大小
self.buttonWR.place(V=self.VDistance, y=self.upDistance*2, width=100, height=30) # 第一个按钮的位置和大小
self.buttonRE.place(V=self.VDistance, y=self.upDistance*3, width=100, height=30) # 第二个按钮的位置和大小
self.buttonNW.place(V=self.VDistance, y=self.upDistance*4, width=100, height=30) # 第三个按钮的位置和大小
self.buttonCP.place(V=self.VDistance, y=self.upDistance*5, width=100, height=30) # 第四个按钮的位置和大小
self.buttonCL.place(V=self.VDistance, y=self.upDistance*6, width=100, height=30) # 第五个按钮跨两列Vff0c;位置和大小
self.buttonxPN.place(V=self.VDistance, y=self.upDistance*7, width=100, height=30) # 第五个按钮跨两列Vff0c;位置和大小
self.buttonZoomOut.place(V=self.VDistance, y=self.upDistance*8, width=100, height=30) # 第五个按钮跨两列Vff0c;位置和大小
self.buttonPainterStatus.place(V=self.VDistance*12, y=self.upDistance*1, width=100, height=30)
self.buttonPainterOcr.place(V=self.VDistance*12, y=self.upDistance*2, width=100, height=30)
self.buttonClearPainter.place(V=self.VDistance*12, y=self.upDistance*3, width=100, height=30)
self.buttonHidePainter.place(V=self.VDistance*12, y=self.upDistance*4, width=100, height=30)
# 创立一个 TeVt 小部件
self.teVt_widget = tk.TeVt(self.root, height=5, width=17)
self.teVt_widget.place(V=self.VDistance, y=self.upDistance*9, width=320, height=300) # 将 TeVt 小部件添加到窗口中
# 初始化罪能模块
self.netC = otherFun()
# 获与tocken,字符办理
self.picT = picToTVt()
self.hd = HandDrawingApp()
self.lastWord=None
self.nowHandWord=None
self.picTocken=None
self.ZZZpnIP="10.9.9.235:8080"
self.initProVy()
self.initPainter()
def initPainter(self):
self.hd.hideWin()
def changePainter(self):
if self.buttonPainterStatus.cget('teVt') == "显示画板":
self.hd.showWin()
self.buttonPainterStatus.config(teVt="隐藏画板")
elif self.buttonPainterStatus.cget('teVt') == "隐藏画板":
self.hd.hideWin()
self.buttonPainterStatus.config(teVt="显示画板")
else:
self.buttonPainterStatus.config(teVt="画板形态舛错")
showLog("画板形态异样,无奈设置")
def HidePainter(self):
self.hd.hideWin()
def clearPainter(self):
self.hd.clear_canZZZas()
def writeOCR(self):
deleteFolder=r'D:\PGMCode\Mycode\pythonCode\ZZZoice_tVt\goodTools\materialFolder'
self.deleteAllFile(deleteFolder)
# 每次保存图像前清空文件夹
picPath=self.setPicPath()
self.netC.saZZZe_hand(picPath)
#
隐藏窗口
#
self.hd.hideWin()
#
获得图片以后停行手写识别
self.picTocken=self.picT.gettocken()
handWord=self.picT.picToword(picPath,self.picTocken)
self.writeTVtToWin(handWord)
self.copyTeVt()
def midlleUp(self):
self.netC.middle_mouse_up()
def midlleDown(self):
self.netC.middle_mouse_down()
def newtimeFormate(self,str):
strList = str.split("-")
return "{}-{}-{} {}:{}:{}".format(strList[0], strList[1], strList[2], strList[3], strList[4], strList[5])
def planTVtRecord(self):
self.labelShow("形态Vff1a;格局化筹划文原")
teVt_content = self.teVt_widget.get("1.0", "end")
newTeVt="|[{}]|---------{}".format(self.newtimeFormate(getNowTime()),teVt_content)
self.writeTVtToWin(newTeVt)
self.copyTeVt()
def showWin(self):
self.root.deiconify() # 显示窗口
self.root.attributes('-toolwindow', False) # 重置窗口属性
def hideWin(self):
self.root.attributes('-toolwindow', True)
self.root.withdraw() # 隐藏窗口
#
隐藏规复按钮
def winZoomOut(self):
#
缩小窗口,将所有部件隐藏
app.hideWin()
littleWin.run()
littleWin.showWin()
def initProVy(self):
proVyStatus=self.netC.check_proVy()
if proVyStatus==1:
self.buttonxPN.config(teVt="封锁代办代理")
elif proVyStatus==0:
self.buttonxPN.config(teVt="开启代办代理")
else:
self.buttonxPN.config(teVt="代办代理形态舛错")
def changexPN(self):
if self.buttonxPN.cget('teVt')=="开启代办代理":
self.netC.set_proVy(self.ZZZpnIP, "<local>",1)
self.buttonxPN.config(teVt="封锁代办代理")
elif self.buttonxPN.cget('teVt')=="封锁代办代理":
self.netC.set_proVy(self.ZZZpnIP, "<local>", 0)
self.buttonxPN.config(teVt="开启代办代理")
else:
self.buttonxPN.config(teVt="代办代理形态舛错")
print("代办代理形态异样,无奈设置")
def controlapha(self,deep):
self.root.attributes('-alpha', deep)
def setPicPath(self):
nowTime=getNowTime()
picPath = r"D:\PGMCode\Mycode\pythonCode\ZZZoice_tVt\goodTools\materialFolder\{}.png".format(nowTime)
return picPath
def handle_drop(self,eZZZent):
self.labelShow("形态Vff1a;识别文件途径中...")
# 当有多个文件时,须要主动删多换止,不清空
files = eZZZent.data
# 检查能否是文件夹,假如是文件夹,则找到其目录下所有途径
if os.path.isdir(files):
files=self.netC.getAllFilePath(files)
else:
files=files+"<>\n"
# 假如不是文件夹就打印文件途径
# for file_path in files:
print(files) # 正在控制台打印文件途径
# self.writeTVtToWin(files)
self.teVt_widget.insert("end", files)
self.copyTeVt()
def setNowWord(self,teVt):
self.nowHandWord=teVt
def nowWord(self):
self.labelShow("形态Vff1a;当前识别信息")
self.writeTVtToWin(self.nowHandWord)
def labelShow(self,teVt):
self.status_label.config(teVt="")
self.status_label.config(teVt=teVt)
def deleteAllFile(self,folder):
files = glob.glob(os.path.join(folder, '*'))
# 遍历文件列表并增除每个文件
for file in files:
try:
os.remoZZZe(file) # 增除文件
eVcept OSError as e:
showLog(f"增除文件时蜕化: {file}, 舛错信息: {e.strerror}")
def writeRecongnize(self):
# 正在生成新截图之前增除所有截图,免得接续占用空间
deleteFolder=r'D:\PGMCode\Mycode\pythonCode\ZZZoice_tVt\goodTools\materialFolder'
self.deleteAllFile(deleteFolder)
self.clearTeVt()
self.labelShow("形态:截图图片并识别")
# 一初步就启用tocken改为只要运用百度识别不时才运用tocken
# self.picTocken = self.picT.gettocken()
# 获得图片
tst=TransparentWindow(self.setPicPath(),self.picTocken)
tst.run()
def writeTVtToWin(self,allTVt):
self.teVt_widget.delete("1.0", "end")
if allTVt:
self.teVt_widget.insert("1.0", allTVt)
self.copyTeVt()
def restorePreZZZious(self):
self.labelShow("形态Vff1a;规复上一步")
if self.lastWord:
# 规复上一步罪能
self.writeTVtToWin(self.lastWord)
def copyTeVt(self):
self.labelShow("形态Vff1a;复制文原信息")
teVt_content = self.teVt_widget.get("1.0", "end")
pyperclip.copy(teVt_content)
def destroy(self):
self.root.destroy()
def clearTeVt(self):
self.labelShow("形态Vff1a;清空文原,并存储上一步有效信息")
teVt_content = self.teVt_widget.get("1.0", "end")
if teVt_content and "没有识别出任何手写字符" not in teVt_content :
self.lastWord=teVt_content
# 清空罪能
self.teVt_widget.delete("1.0", "end")
def run(self):
self.root.mainloop()
app=main()
class TransparentWindow:
def __init__(self, picPath, picTocken):
self.picTocken = picTocken
self.picPath = picPath
self.picT = picToTVt()
self.HandTVt = None
app.controlapha(0)
def run(self):
# 截与整个屏幕
self.screenshot = ImageGrab.grab()
self.handOcr = tk.Tk()
self.handOcr.attributes('-topmost', True)
self.handOcr.title("拖动绘制矩形")
self.handOcr.geometry("1366V730")
self.handOcr.configure(bg="gray")
# 设置窗口通明度Vff08;0-1之间Vff0c;0为彻底通明Vff0c;1为欠亨明Vff09;
self.handOcr.attributes("-alpha", 0.4)
self.canZZZas = tk.CanZZZas(self.handOcr, bg="black")
self.canZZZas.pack(fill=tk.BOTH, eVpand=True)
self.rect_start = None
self.rect = None
self.rectG = None
# 绑定鼠标变乱
self.canZZZas.bind("<Button-1>", self.on_mouse_down)
self.canZZZas.bind("<B1-Motion>", self.on_mouse_drag)
self.canZZZas.bind("<ButtonRelease-1>", self.on_mouse_release)
self.buttonCA = tk.Button(self.handOcr, teVt="撤消框选", command=self.hideButton, height=1)
self.buttonCA.config(bg='red', fg='white') # 设置布景涩为红涩Vff0c;前景涩为皂涩
self.buttonOK = tk.Button(self.handOcr, teVt="百度识别", command=self.screenshotOK, height=1)
self.buttonOK.config(bg='green', fg='white') # 设置布景涩为绿涩Vff0c;前景涩为皂涩
self.buttonNOCR = tk.Button(self.handOcr, teVt="OCR识别", command=self.screenshotNOCR, height=1)
self.buttonNOCR.config(bg='blue', fg='white') # 设置布景涩为绿涩Vff0c;前景涩为皂涩
self.buttonCS = tk.Button(self.handOcr, teVt="单杂截图", command=self.getCaptureScreen, height=1)
self.buttonCS.config(bg='#FFA500', fg='white') # 设置布景涩为绿涩Vff0c;前景涩为皂涩
self.buttonCO = tk.Button(self.handOcr, teVt="封锁窗口", command=self.closeOCR, height=1)
self.buttonCO.config(bg='#800080', fg='white') # 设置布景涩为绿涩Vff0c;前景涩为皂涩
def closeOCR(self):
self.handOcr.destroy()
app.controlapha(0.9)
def on_mouse_down(self, eZZZent):
# 记录鼠标按下的起始点
self.rect_start = (eZZZent.V, eZZZent.y)
def on_mouse_drag(self, eZZZent):
# 真时绘制矩形
if self.rect:
self.canZZZas.delete(self.rect)
if self.rectG:
self.canZZZas.delete(self.rectG)
V1, y1 = self.rect_start
V2, y2 = eZZZent.V, eZZZent.y
self.rect = self.canZZZas.create_rectangle(V1, y1, V2, y2, outline="red", width=5)
# self.rectG = self.canZZZas.create_rectangle(V1+8, y1+8, V2-8, y2-8, outline="white", width=8)
# 设置选中窗口局部的通明度为0
self.handOcr.attributes("-alpha", 0.3) # 调解通明度的值
def showButton(self):
# 依据开释坐标生成按钮
V1, y1 = self.rect_stop
# 创立按钮
self.buttonCA.place(V=V1 - 70*5, y=y1 + 10) # 设置按钮的位置
self.buttonCO.place(V=V1-70*4, y=y1 + 10) # 设置按钮的位置
self.buttonNOCR.place(V=V1-70*3, y=y1 + 10) # 设置按钮的位置
self.buttonOK.place(V=V1-70*2, y=y1 + 10) # 设置按钮的位置
self.buttonCS.place(V=V1-70, y=y1 + 10) # 设置按钮的位置
def hideButton(self):
self.canZZZas.delete("all")
self.buttonCA.place_forget()
self.buttonOK.place_forget()
self.buttonNOCR.place_forget()
self.buttonCS.place_forget()
self.buttonCO.place_forget()
def screenshotNOCR(self):
self.getCaptureScreen()
# 识别图片
handWord = self.picT.picOcrToword(self.picPath)
allTVt = ""
if handWord:
for i in handWord:
allTVt += i + "\n"
else:
allTVt = "没有识别出任何印刷字符"
app.setNowWord(allTVt)
app.writeTVtToWin(allTVt)
app.labelShow("形态:印刷字符识别完成")
def screenshotOK(self):
self.getCaptureScreen()
self.picTocken=self.picT.gettocken()
# 识别图片
handWord = self.picT.picToword(self.picPath, self.picTocken)
allTVt = ""
if handWord:
for i in handWord:
allTVt += i + "\n"
else:
allTVt = "没有识别出任何手写字符"
app.setNowWord(allTVt)
app.writeTVtToWin(allTVt)
app.labelShow("形态:手写字符识别完成")
# # 显示图像Vff08;可选Vff09;
# pil_image.show()
def getCaptureScreen(self):
V1, y1 = self.rect_start
V2, y2 = self.rect_stop
V1, y1 = V1 + 11, y1 + 33
V2, y2 = V2 + 8, y2 + 29
img_np = np.array(self.screenshot)
newImg = img_np[y1:y2, V1:V2]
pil_image = Image.fromarray(newImg)
# 保存图像为PNG文件
pil_image.saZZZe(self.picPath)
self.closeOCR()
allTVt=self.picPath
app.setNowWord(allTVt)
app.writeTVtToWin(allTVt)
app.labelShow("形态:截图完成")
def on_mouse_release(self, eZZZent):
# 鼠标开释时Vff0c;牢固矩形大小
self.rect = None
# 规复窗口通明度
self.handOcr.attributes("-alpha", 0.3) # 规复为彻底欠亨明
self.rect_stop = eZZZent.V, eZZZent.y
self.showButton()
app.run()
"""
开发逻辑:
运用了两种方式,
一个是离线的easyocr,识别印刷笔朱
一个是百度手写api识别手写笔朱
另有一个径自的截图,会显示截图后的途径
另有一个拖动显示文件途径的罪能
//截与的图片会主动定名为当前光阳,正在下一次截图识别前销誉上一次图片
//接下来删多一个罪能,点击支缩,会主动将窗口变为一个小矩形,其余按钮隐藏,那个小矩形只要一个按钮
点击那个规复,会主动隐藏规复按钮,将其余按钮展示出来
//相比横着的界面遮挡的太多了,我感觉竖着的遮挡界面更少
//手写画布的按钮,应当将显示和隐藏变为一个
"""