スクショした画像を、一発で特定のフォルダーに保存！

# ちょこっと業務を簡略化したい
　この記事では、ちょこっと効率化させたいことをプログラミングやツールをつかって解決していきます
ちょこっと削減した時間を、もっと人生楽しくなることに使いましょう！


# 本日のお題
## 　スクショしたデータを、一発で特定のフォルダーに保存！

```デフォルトの保存場所:デフォルトの保存場所
Mac:デスクトップ
Windows:「ピクチャ」フォルダー内の「スクリーンショット」フォルダー
```

特定のフォルダーへ移動させたい時、**「ファイル名変更＋フォルダー移動」**　めんどくさくないですか?

もし複数スクショしたい場合、あーもう！😡💢　ってなりませんか？


こんな時に役に立ちます。


## pythonデスクトップアプリ(tkinter)解決してみた
<環境>
🖥 Windows
🐍 python 3.12.5
🏆 VSCode


動画（音量調整してください⚠）　↓

[![YouTube動画](https://img.youtube.com/vi/xWb6uQsTGV0/hqdefault.jpg)](https://youtube.com/shorts/xWb6uQsTGV0?feature=share)



① 実行画面↓

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/789001bd-2715-2275-1d8b-f580dbbc6a6b.png" width=40%>

② スクショする
Mac: Command (⌘) + Shift + 4
Windows: Win + Shift + S

③　内容の確認　

```クリックボードからスクリーンショットを表示```をクリック

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/bfaf6420-7157-7526-f4e3-9c9e4dfdb306.png" width=40%>


④ ファイル名の変更
デフォルトで「印刷記事」を記入してあるのでファイル名を変更してください

![スクリーンショット 2024-10-19 18.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/73cae393-271b-e3d5-a700-62d051166769.png)


⑤ フォルダー指定
```表示されたスクリーンショットをPNGとして保存```をクリックでファイルの選択

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/c87d24f5-262b-0c39-043c-40e61cb77bf5.png" width=60%>


⑥　完了！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/52a95044-f128-c981-9922-6cf2f3f45df2.png" width=60%>



フォルダーの指定とファイル名変更ができました✨



## tkinter　コード一部解説
※文言変更してください！


① デフォルトのファイル名を変更する
デフォルトを設定できます

![スクリーンショット 2024-10-19 18.32.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/73cae393-271b-e3d5-a700-62d051166769.png)



```python:python
# デフォルトの記事名（ここ変更）
filename_entry.insert(0, "印刷記事") 
```

:::note info
２箇所あり
:::


② ボタンの意味

![スクリーンショット 2024-10-19 18.51.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3636287/56db481d-5b04-1f1d-ad30-d0254a1d8701.png)


- ```クリックボードからスクリーンショットを表示```　→ スクショしてからボタンを押すと上にイメージが出てくる（サイズ調整していない）
- ```表示されたスクリーンショットをPNGとして保存```　→ PNGとして特定のフォルダーに保存する
- ```すべてリセット```　→ 消去


## 全体コード
<details><summary>全体コードはこちら</summary>

```python:python
import customtkinter as ctk
from tkinter import filedialog
from PIL import Image, ImageTk, ImageGrab
import os
import time

# tkinterウィンドウの作成
ctk.set_appearance_mode("System")  
ctk.set_default_color_theme("blue")  
root = ctk.CTk()  
root.geometry("500x600")


display_image = None


message_label = ctk.CTkLabel(root, text="", fg_color="red")
message_label.pack(pady=10)


filename_label = ctk.CTkLabel(root, text="保存するファイル名 :")
filename_label.pack(pady=5)

filename_entry = ctk.CTkEntry(root, width=200)
filename_entry.pack(pady=10)

# デフォルトの記事名（ここ変更）
filename_entry.insert(0, "印刷記事")  

# キャンバスの作成
canvas = ctk.CTkCanvas(root, width=500, height=300)
canvas.pack()


def display_screenshot_from_clipboard():
    global display_image
    time.sleep(1) 

 
    screenshot = ImageGrab.grabclipboard()
    
    if isinstance(screenshot, Image.Image): 
  
        display_image = ImageTk.PhotoImage(screenshot)

        canvas.create_image(0, 0, anchor="nw", image=display_image)
        message_label.configure(text="スクリーンショットが表示されました", fg_color="green")
    else:
        message_label.configure(text="クリップボードに画像がありません。もう一度スクリーンショットを選択してください。", fg_color="red")

# 画像をPNGとして保存する関数
def save_image_as_png():
    if display_image is not None:

        screenshot = ImageGrab.grabclipboard()

    
        file_name = filename_entry.get().strip()
        if not file_name:
            message_label.configure(text="ファイル名を入力してください。", fg_color="red")
            return

        save_directory = filedialog.askdirectory()
        
        if save_directory:
            
            png_path = os.path.join(save_directory, f"{file_name}.png")
            screenshot.save(png_path, "PNG")
            message_label.configure(text=f"PNGが保存されました: {png_path}", fg_color="green")
        else:
            message_label.configure(text="保存先が選択されていません。", fg_color="red")
    else:
        message_label.configure(text="表示された画像がありません。スクリーンショットを取得してください。", fg_color="red")

# すべてをリセットする関数
def reset_all():
    global display_image
    display_image = None
    canvas.delete("all")  
    filename_entry.delete(0, ctk.END)  
    # デフォルトの記事名（ここ変更）
    filename_entry.insert(0, "印刷記事")  
    message_label.configure(text="すべてがリセットされました。", fg_color="green")


display_button = ctk.CTkButton(root, text="クリップボードからスクリーンショットを表示", command=display_screenshot_from_clipboard)
display_button.pack(pady=10)


save_button = ctk.CTkButton(root, text="表示されたスクリーンショットをPNGとして保存", command=save_image_as_png)
save_button.pack(pady=10)

reset_button = ctk.CTkButton(root, text="すべてリセット", command=reset_all)
reset_button.pack(pady=10)

root.mainloop()

```
</details>



# 🧡最後に
このコードをベースに修正し、業務をちょこっと楽にしてみてください〜


今後、このようにちょっとした効率化のための情報を載せます。あなたの業務でも役立つこと願っています💓