3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[Python] 自動的にスクショを取るプログラムの作成レポ

Posted at

初投稿につき、コメントやSuggetion等ありましたら幸いです。

1. 初めに

 毎時ごとにスクリーンショットを取る必要が出たため、Pythonの勉強を兼ねて簡単なコードを作成、その後三日ほど運用しました。

2. 使用したものとバージョン

 Windows 10 Home: 21H2
 VS Code: 1.71.0
 Python: 3.10.1, pip: 22.2.2
 ライブラリ
 schedule: 1.1.0
 PyAutoGUI: 0.9.53

導入に際しては pip install schedule, pip install PyAutoGUIとしました。
 

3. 書いたコードと説明

 以下のコードを使用しました。

AutoGetFig.py
import datetime         # 現在時刻を取得するためのライブラリ
from time import sleep
import pyautogui        # スクリーンショットを取るためのライブラリ
import schedule         # 時間ごとに実行するためのライブラリ

# 保存場所の指定
currentDir = "C:\Python\screenshots\\"
# 拡張子の指定
extention = ".png"

# 実行内容の定義
def task():
    dt_Now = datetime.datetime.now()
    # 今日の日付と時間までをファイル名にする
    fileName = str(datetime.date.today()) + " " + str(dt_Now.hour) + "-" + str(dt_Now.minute) + "-" + str(dt_Now.second)
    Path = currentDir + fileName + extention
    # スクリーンショットを取って保存する
    pyautogui.screenshot().save(Path)
    # スクショを取ったらコマンドプロンプトで報告
    print("Got screenshots" + "\t" + fileName)

# 毎時ごとにtask()を実行
schedule.every().hours.at(":00").do(task)

# プロブラムを止めるまで続ける
while True:
    schedule.run_pending()
    sleep(1)

各部分について説明していきます。

保存場所

 保存場所についてですが、今回はCドライブのあるフォルダ上(動作プログラムとは別のもの)に保存したかったため
currentDir = "C:\Python\screenshots\\"
としています。
また、task関数内ではファイル名のみを扱いたかったため、この時点でバックスラッシュをエスケープさせつつ入れています。

タスク本体

 今回は「スクリーンショットを取る」を毎時行いたいのでスクリーンショットを取る関数を作成しました。

ファイル名について

スクショを取った時間が欲しいので
dt_Now = datetime.datetime.now()
として現在時刻を取ってくる変数を作っています。dtはdatetimeの略です。
したがって、実際のファイル名は
fileName = yyyy-mm-dd(今日の日付) hh-mm-ss(その時の時間)
となります。なお、結合などを便利にするためfileNameの時点でdatetimeでとってきた各値(時間や秒数など)はString値にキャストしています。

スクショを取る

スクショを取るにはpyautogui.screenshot().save("ファイルの名前.png")とします。今回は絶対パスと組み合わせてファイルの名前を決めていますが、ファイル名のみの指定ならばカレントディレクトリ上に画像ファイルが出来上がります。
なお、.save()の引数はString値で拡張子込みのため、拡張子を忘れたりするとエラーを吐きます(1敗)。

scheduleの実行

 タスク本体を実行するために2つのパーツを用意しました。

scheduleの設定

 scheduleの実行条件(いつ何を実行するか)を書いています。
schedule.every().hours.at(":00").do(task)では
.every().hours.at(":00")で頻度を、.do(task)で実行する関数を指定しています。
今回は毎時0分0秒の値が欲しかったのでこのようになっていますが、例えば
”30秒ごとにスクショしたい” であれば.every(3).seconds.do(task)とすればいいはずです。

実行条件

 「いつまで(どのくらい)実行するか」をwhileを使って書いています。
今回は ”とりあえず続けて中止はコマンドプロンプトでしよう” と考えていたのでwhile Trueとなっています。その後、schedule.run_pendingで先ほど設定したscheduleを実行させます。

4. 終わりに

いかがでしたでしょうか。今回は急に必要になったためペライチ(ペラ紙一枚の意)のコードでしたが、今後頻繁に必要になるようならtkiterを使用して、ファイル名や保存先を指定できるアプリ状のものに変えようかと思います。

この記事は以下の情報を参考にして執筆しました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?