Pythonで選択した範囲の文字列を読みとって、txtファイルに出力してみた（そしてショートカット起動へ...）

## 今回つくるやつは、以下を組み合わせたやつ
1. ショートカットキーに、Pythonを実行するためのbatファイルを登録
1. PyQt5で作ったSnipping Tool
1. pytesseractで、文字識別

## 対象者
* なんか暇つぶしに作りたい人
* Pythonを学びたい初学者
* **リモートデスクトップ先の文字をコピりたいやつ**
* **なんか同じようなものを作ろうとして、詰んでるやつ**

## 注意書き
:::note alert
2024年08月24日(土)時点での実装です
(だいたい5年経ってたら大きく仕様変わってるかも)
:::

## 準備するもの(手順は後述)
1. Pythonの実行環境（実行環境は自力で作って）
1. tessreractインストール（[これ](https://hituji-ws.com/code/python/tesseract-ocr/)の「tessreractインストール」の部分**だけ**をみて作って）
1. Pythonを実行するだけの、batファイル
1. Pythonファイル
1. Windows 11
1. テストステロン

## 1\.batファイルに登録したmain.pyの作成
1-1\. エディタで下記の内容をmain.pyとして保存する
```python
# -*- coding: utf-8 -*-

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
import tkinter as tk
from PIL import ImageGrab
import numpy as np
import cv2
import pytesseract
import os

class MyWidget(QtWidgets.QWidget):

    def __init__(self):
        super().__init__()
        root = tk.Tk()
        screen_width = root.winfo_screenwidth()
        screen_height = root.winfo_screenheight()
        self.setGeometry(0,0,screen_width, screen_height)
        self.setWindowTitle("")
        self.setWindowOpacity(0.3)
        QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor))
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.begin = QtCore.QPoint()
        self.end = QtCore.QPoint()

        print("Capture the screen...")
        self.show()

    def paintEvent(self, event):
        qp = QtGui.QPainter(self)
        qp.setPen(QtGui.QPen(QtGui.QColor("black"), 3))
        qp.setBrush(QtGui.QColor(128, 128, 255, 128))
        qp.drawRect(QtCore.QRect(self.begin, self.end))       

    def mousePressEvent(self, event):
        self.begin = event.pos()
        self.end = self.begin
        self.update()

    def mouseMoveEvent(self, event):
        self.end = event.pos()
        self.update()

    def mouseReleaseEvent(self, event):
        self.end = event.pos()
        self.close()

        x1 = min(self.begin.x(), self.end.x())
        y1 = min(self.begin.y(), self.end.y())
        x2 = max(self.begin.x(), self.end.x())
        y2 = max(self.begin.y(), self.end.y())

        img = ImageGrab.grab(bbox=(x1,y1,x2,y2))
        img = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2RGB)

        # Tesseractのフルパスを指定
        pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

        # OCR結果を保存するディレクトリのパス
        OUTPUT_DIR = './'

        # OCRでテキストを抽出
        config = '--tessdata-dir "C:\\Program Files\\Tesseract-OCR\\tessdata"'
        text = pytesseract.image_to_string(img, config=config)

        # テキストファイルに出力
        output_file_path = os.path.join(OUTPUT_DIR, f"OCR.txt")
        with open(output_file_path, 'w', encoding='utf-8') as f:
            f.write(text)
            
        cv2.destroyAllWindows()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MyWidget()
    window.show()
    app.aboutToQuit.connect(app.deleteLater)
    sys.exit(app.exec_())


```



## 2\.ショートカットキーに、Pythonを実行するbatを登録
2-1\.batファイルを以下の通りに作る、名前は好きにしていいよ、ただmain.pyと同じディレクトリに保存して
```bat
@echo off
start "" "python" "main.py"
```

2-2\.「エクスプローラー」上で、作ったbatファイルを右クリック->`その他のオプションを確認`->`ショートカットの作成(S)`をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2914000/280fac5c-6df6-b6bb-cf31-54e5f43ec7f5.png)

2-3\. 出来上がった`ショートカットファイル`を、デスクトップに置く

:::note warn
デスクトップに置かないと、ショートカットキーが[実行できない](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12244031047#:~:text=%E3%81%9F%E3%81%A0%E3%81%97%E3%80%8C%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E3%80%8D%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AF%E3%80%8C%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%80%8D%E3%81%8C%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%BE%E3%81%9F%E3%81%AF%E3%80%8C%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%80%8D%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AE%E9%9A%8E%E5%B1%A4%E3%81%AB%E3%81%82%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E3%81%BF%E3%81%A7%E3%81%99%E3%80%82)）らしい
:::


2-4\.デスクトップにある`ショートカットファイル`を右クリック->`プロパティ`->`「ショートカット」タブ`->`ショートカットキー`に、任意のキーを登録->`適用`->`OK`

:::note warn
「Ctrl+Alt」との組み合わせは必須で、なおかつ他のソフトで使用されていないようなやつにしたほうがいいよ
:::

## 感想
なんか面白いものを作ってみたくて、思いついたものをいろいろなサイトを参考にしながら作ってみた。
妥協したところはありつつも、結構面白いものができて満足です。
次回は「e-typingをスクレイピング＆文字識別して、ランキング1位取ってみた」を公開します！


## 参考
* [Pythonのライブラリで「お気に入りのショートカットキー作ってみる」](https://zenn.dev/timoneko/articles/7612a5972297b1)
* [Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
* [Windows10でbatファイルを一瞬で起動する方法](https://qiita.com/tkmsk/items/2eee1ee7c970204396cc)
* [コマンドプロンプトにて一箇所にパスを通してその中にショートカット(?)を置き実行したい](https://qiita.com/r12tkmt/items/b87ae823386d07c50c55)
* [PythonでWindowsのスニッピングツールらしきものを実装してみた](https://qiita.com/harupy/items/d4f7978c4d8d1c2a3d01)]
* [画像からテキストを抽出！PythonとOCRを利用した処理テクニック](https://aijimy.com/dx/ocr-python/)
* [【python できること】pyocr + tesseractを使ったOCR](https://hituji-ws.com/code/python/tesseract-ocr/)
* いろいろなものを組み合わせただけ