クリップボードの画像・テキストを自動保存するソフトウェア 【Python】

Python

クリップボードの画像を自動保存するソフトウェアを作成しましたので、サンプルコードを公開します。
テキスト文字列についても自動保存します。

Python を使っていますのであらかじめインストールしておく必要があります。
以下の環境で動作確認をしています。

環境:Windows 10、Python 3.x(、Anaconda)

背景

画面キャプチャ・スクリーンショットの手順が煩雑

PC の画面をワンショットで記録しておきたいとき、通常は描画アプリなどで画像を保存することになると思います。
Windows 標準のアプリを使う場合は、アプリ起動 → キャプチャする → 名前をつける → 保存を実行する、というステップを踏む必要があります。
画像の取得が1枚だけであれば、特に問題はありません。
しかし、取得したい画像が数十枚に増えてくると、名前をつけるだけでもとても煩雑です。これにテキストの保存が加わると、さらに大変です。

やりたいこと: クリップボードの画像やテキストを自動保存したい

そこで、クリップボード内に画像やテキストがあったら、判別して自動保存するソフトウェアを作成しました。
クリップボードに画像やテキストをコピーすると、クリップボード内の画像やテキストを判別して、日付・時刻つきのファイル名で自動保存します。

具体的な活用例としては、今回のソフトウェアを使って、まず最初に必要となる/欲しくなる可能性のある画像や文字列をすべてキャプチャします。
つぎに、テキストや画像の取得をすべて終えたら、中から使えそうなテキスト、画像、一番うまく撮れたショットだけをピックアップして活用します。こうすることで作業効率が格段に上がります。
(人がマウス操作をしてファイル名を手打ちするのに比べると数十~数百倍作業効率が上がると思います。また、作業後、不要なファイルを一括削除するのは簡単です。)

使い方

① clipboardcapture.py 等の名前でテキストファイルを作成し、末尾のサンプルコードをコピー&ペーストして保存してください。
② つぎに、コマンドプロンプトで “python clipboardcapture.py” 等と入力して実行してください。GUI が表示されます。もしも起動をもっと簡単にしたい場合は、下記リンクを参照して、バッチファイルを作ってみてください。ダブルクリックで起動できます。
③ 「start」ボタンをクリックすると、クリップボード内にコピーされている画像、テキストを自動で取得して保存します。「stop」をクリックすると停止します。

たとえば、上記のアプリを動作させた状態で、ブラウザやアプリの画面を選択し、キーボードの [ctrl] + [alt] + [prt sc] の3つのボタンを同時に押してみてください。
すると、クリップボードにコピーされた画像が、python スクリプトと同じ場所に保存されます。画像が取得されると、クリップボードのデータはクリアされます。

テキストついても同じです。任意のテキストデータを準備し、テキスト部分を選択して、[ctrl] + [c] を押します(選択した文字列をクリップボードにコピーします)。
すると、クリップボードの内容が自動的にテキストファイル形式で保存されます。
他の例として、Word、テキストエディタ、HTML などを開いて選択した状態とし、[ctrl] + [a] ですべて選択し、[ctrl] + [c] とすると、テキストデータの取り込みができます。

ソフトウェアの説明

クリップボード内のデータを常時監視する

・ GUI 上でボタンをクリックしてアプリを稼働させると、スクリプトの self.master.after( 2000, self.update ) としたところで、2秒おきに self.capture1() を繰り返し実行します。これにより、クリップボードを監視します。

pyperclip でテキストの取得を試みる & ImageGrab で画像を取得する

・ 一定時間で繰り返し実行される capture1() 内で、ImageGrab.grabclipboard() と pyperclip.paste().strip().replace( .. ) を実行し、クリップボード内の画像とテキストの取得を試みます。
・ ポイントとなるのは、str1 = pyperclip.paste() となっているところです。
pyperclip.paste() は、クリップボード内の「テキスト」の取得を行います。
もし、テキストの取得に成功した場合、str1 は空欄ではなくなります。
・ そこで、続く if 文の部分で、テキストが取得できたかどうかを判別します。これにより、クリップボード内にテキストがあるかどうかを判断します。
テキストが取得できた場合、if 文の前半の部分で、*.txt 形式で保存します。
・ テキストの取得ができない場合、クリップボード内に画像がある場合と、画像がない場合とがあります。
そこで、elif 文で画像の有無を判別します。
画像があった場合は、画像を保存します(ここでは jpg 形式としています)。
・ クリップボードから、テキストあるいは画像が取得できた場合、それぞれファイル名を設定して保存しています。
・ データの取得に成功したとき、クリップボード内にデータを残したままですと、クリップボードを繰り返し監視する際、同じデータをずっと保存し続けてしまいます。そこで、データの取得・保存に成功した場合は、クリップボード内を空にします。
具体的には、pyperclip.copy( “” ) を実行し、カラとなっているデータ “” をコピーすることで、クリップボードを空にします。
これで、クリップボード内にデータがコピーされるのを待ち受ける状態となります。

まとめ

クリップボード内の画像、テキストを自動保存するソフトウェアをまとめました。
作業手順書などを作成していて、いくつか画面キャプチャをしたいときなど、活用してみてください。

なお、ここではアプリの例を挙げましたが、もう少しベーシックなクリップボードの使い方について、関連リンクなどにまとめています。また、こうして取得した画像を結合して gif ファイルを作ることも可能です。
もし関心のある方は参考にしてみてください。

関連リンク
・ クリップボードの使い方 サンプルコード
・ 画像に文字を書いて出力する 【Python】
・ 指定したエリアの画像を保存するソフトウェア 【tkinter】
・ tkinter テキストボックスとボタン サンプルコード
・ 動画作成ソフトウェア【Python & mp4, gif】

サンプルコード:クリップボードの自動監視&自動保存

# -*- coding: utf-8 -*-

from PIL import ImageGrab, Image
import tkinter
import time as tm1 
import datetime as dt1
import pyperclip 
import os 

class Application( tkinter.Frame ):
    def __init__(self, master): 
        super().__init__(master) 
        self.flag1 = 0 
        self.path1 = os.path.dirname(__file__) + "\\" 
        self.pack() 
        master.title(u"clipboard capture")
        master.geometry("300x40")
        self.label1 = tkinter.Label(text='')
        self.label1.place(x=10, y=10) 
        self.btn1 = tkinter.Button(master, text='start', command=self.btn_click1, bg='orange')
        self.btn1.place(x=180, y=10, width=100)
        master.after(2000, self.update) 

    def update(self): 
        if self.flag1 == 1: 
            datetime1 = dt1.datetime.now().strftime( "%Y%m%d_%H%M%S" ) 
            file1 = datetime1
            self.label1["text"] = file1 
            ret1 = 0 
            ret1 = self.capture1( file1 ) 
        self.master.after(2000, self.update) 

    def capture1( self, file0 ): 
        ret1 = "0" 
        im1 = ImageGrab.grabclipboard()
        str1 = pyperclip.paste().strip().replace( "\r\n", "\n" ) 
        if str1 != "": 
            print( str1 ) 
            file1 = self.path1 + str(file0) + ".txt" 
            write1( file1, str1 ) 
            pyperclip.copy("") 
            ret1 = "1" 
        elif isinstance(im1, Image.Image):
            file1 = self.path1 + str(file0) + ".jpg" 
            print( file1 ) 
            im1.save( file1 )
            pyperclip.copy("") 
            ret1 = "1" 
        return ret1 

    def btn_click1( self ): 
        self.label1.config( text = '' ) 
        if self.flag1 == 0:
            self.flag1 = 1 
            self.btn1.config(bg = 'red', text = 'stop' ) 
        else: 
            self.flag1 = 0 
            self.btn1.config(bg = 'orange', text = 'start' ) 

def write1( file1, str1 ): 
    with open( file1, 'w', encoding='utf-8' ) as f1: 
        f1.write( str1 ) 
    return 0 

def main(): 
    root = tkinter.Tk()
    app = Application( master=root ) 
    app.mainloop()

if __name__ == "__main__": 
    main() 
タイトルとURLをコピーしました