thumbnail.png

PythonをEXE化してWindowsPC用画像ダウンローダを作ってみた

Pocket

年賀状のイラスト

今まで年賀状のイラストはネットで検索して、良さそうなのがあったらちまちま保存してました。でも、これって結構時間がかかるんですよね。(^^;
そこで今年は画像ダウンローダを作って快適に画像を保存することにしました。数百個のイラストも一瞬でダウンロードできるので快適ですね。(^^♪

今回やったことを備忘録として残したいと思います。大まかな流れは以下の手順になります。

手順

1. GoogleImagesDownloadでコマンドプロンプトからダウンロード出来るようにする
2. wxPython、wxGladeでGUI化して使いやすくする
3. py2exeでPythonがない環境の人でも使えるようにする

ちなみに私の環境は以下の通りです。

- Windows10
- Python 3.8.12
- VSCode 1.63.2

1.GoogleImagesDownloadでダウンロード出来るようにする

GoogleImagesDownloadインストール

“`
pip install google-images-download
“`
これでもインストール出来るようですが、上手くいかないことが多いようですので、以下のようにgithubから直接インストールします。
“`
pip install git+https://github.com/Joeclinton1/google-images-download.git
“`

また、GoogleImagesDownloadだけでは100個までしかダウンロード出来ないので、ChromeDriverもインストールします。

ChromeDriverインストール

こちらはPCにインストールされているChromeのバージョンにあったドライバーをインストールします。

Chromeのバージョン確認方法
Chromeの右上にある点3つ→設定→Chromeについてにある最初の数字(赤下線)

以下からChromeのバージョンにあったドライバーをインストールして下さい。
ChromeDriver – WebDriver for Chrome – Downloads

◆CUIでダウンロード

▼コマンドプロンプトで以下のように入力すれば

▼ダウンロード出来ます

ちなみにここで入力したコマンドは
“`
googleimagesdownload -k “鬼滅の刃 炭治郎” -l 200 -cd “./chromedriver.exe”
“`
になります。ここでは

- 検索キーワード=鬼滅の刃 炭治郎
- 最大ダウンロード数=200
- chromedriverのパス

を設定してます。
引数に関しては以下のサイトを参考に。
[Python]Google images downloadを用いて簡単に画像取得 – Qiita

2.wxPython、wxGladeでGUI化

上述したようにコマンドプロンプトでダウンロードしてもいいですが、毎回引数を設定するのは面倒です。そこでGUI化してみました。

PythonでGUI化というと、Python標準のTkinterPySimpleGUIwxPython等が有名です。中でもボタン等のオブジェクトを見ながら配置できるwxGladeが使えるwxPythonがオススメです。今回はwxPythonとwxGladeでGUI化してみました。

wxPythonインストール

コマンドプロンプトからpipでインストールします。
“`
pip install wxPython
“`
ボタン等のオブジェクトの説明に関しては以下のサイトが参考になります。

wxPython | Python-izm

wxPython公式サイト
wxPython API Documentation — wxPython Phoenix 4.1.1 documentation

wxGladeインストール

wxGlade公式サイト
wxGlade: a GUI builder for wxWidgets/wxPython
上記公式サイトからダウンロード出来ます。

wxGladeダウンロード方法を含め、使い方は以下のサイトが参考になります。
wxGladeをざっくり使う pythonコード出力まで

◆imagedownload.py作成

今回作ったwxGladeのファイルは以下になります。
Download ActionDropbox – wxglade_imagedownload3.wxg

このファイルをPython形式で出力して、Classや関数を追加したimagedownload.pyは以下になります。
Download ActionDropbox – imagedownload.py

GUIの見た目等を変えたい方は、上記プログラムをダウンロードしてお好きなように改変してください。

尚、以下のサイトを参考にコードを追加しました。
wxPythonでダイアログ生成をするには – 兎の真似をする烏

◆imagedownload.py使い方

1. imagedownload.pyと同じフォルダにdriverフォルダを作成
2. そこにchromedriver.exeを入れる
3. VSCodeやコマンドプロンプト等でimagedownload.pyを実行

▼ImageDownloaderが立ち上がります

- 検索ワード
スペース区切りでAND検索します。カンマ区切りはそれぞれ検索します。
下で設定した保存フォルダの中に、検索ワードのフォルダができます。

- 画像形式
jpg,png,bmp,gif,svgから選択

- 画像サイズ
large,middleから選択

- 検索数
半角数字を入力

- 出力先
右のBrowseボタンで保存フォルダ選択。
デフォルトはimagedownload.pyと同じフォルダ内にimgフォルダを生成して、そこに保存されます。尚、1度設定すれば設定し直すまで同じフォルダに保存されます。

3.py2exeでEXE化

サクサクダウンロードしてたら、大学生の娘もImageDownloaderが欲しいと言うのでEXE化してみました。

PythonスクリプトのEXE化は、pyinstallerpy2execx_Freeze等が有名です。
ネットで調べると、pyinstallerは簡単にEXEを作れるけど容量が大きく動作が遅いというのをよく見ます。
なのでpy2exeかcx_Freezeですが、cx_Freezeは何故かエラーが頻発したのでpy2exeにしました。

py2exeインストール

インストールはpipでできます。
“`
pip install py2exe
“`

インストール、setup.pyの作り方、EXE化の仕方は以下のサイトを参考にしました。
py2exeのインストール【Pythonプログラムのexe化】 | ジコログ

ただ、今回はGUIのEXE化と、chromedriver.exeも同梱してGUIからchromedriver.exeを起動できるようにしないといけないところでちょっと躓きました。

以下が最終的に動くようになったsetup.pyです。

setup.py

“`Python
from distutils.core import setup
import py2exe

option = {
‘compressed’: True,
‘optimize’: 2,
‘bundle_files’: 3,
‘includes’:['google_images_download', 'wx', 'subprocess', 'selenium'],
‘excludes’: ['pandas', 'numpy', 'lxml', 'tkinter']
}

setup(
options = {
‘py2exe’: option,
},
windows = [
{'script': 'imagedownload.py'}
],
zipfile = None,
data_files = [('driver', ['driver/chromedriver.exe'])]
)
“`

ダウンロードは以下からできます。

Download ActionDropbox – setup.py

setup.pyの引数

- 今回のように実行時にGUIのWindowを立ち上げる場合は、console=ではなく
“`windows = [
{'script': 'Pythonスクリプト名.py'}
]“`

- zipfileはNone。
- 同梱する外部ファイルの設定はdata_files=リスト形式の中にタプル形式で記述。外部ファイルが複数ある場合はタプルをカンマ区切りで複数記述。タプルは第1要素=同梱する時の保存先パス、第2要素=外部ファイルのパスを記述したものを[ ]で括る。
尚、同梱する時の保存先パスをEXEファイルと同じ場所にしたい時は、空欄(シングルクォート2つ)になります。
- optionsのoptionに入れる項目について
bundle_filesは3(バンドルしない設定=EXEにdll等を含めない設定)にしないとchromedriver.exeが起動しない
– 必須のモジュール(今回はgoogleimagesdownloadやwx等)はincludesにリスト形式で記述
– 明らかに不要なモジュールはexcludesにリスト形式で記述←PandasやNumpyはファイルサイズが大きいので使わないならexcludesに設定しておく。

◆EXE化実行

EXE化したいPythonスクリプトと同じ場所にsetup.pyを置き、(ここには既にdriverフォルダがあって、そこにはchromedriver.exeが入っているとします)VSCodeやコマンドプロンプトで以下のコマンドを実行。

“`
python setup.py py2exe
“`

すると、スクリプトと同じ場所にdistフォルダが生成されます。この中にあるImageDownload.exeがEXE化されたスクリプトです。

distフォルダ内の大量にあるファイルから毎回ImageDownload.exeを探すのが面倒な方はショートカットを作ってデスクトップ等に置いておくといいでしょう。EXEファイルを単体で移動しても動作出来ないので注意して下さい。

◆動作確認

ImageDownload.exeを実行すると、ImageDownload.pyを実行した時と同様にGUIが立ち上がりますが、セキュリティの警告が出ることがあります。

▼ウィルスバスターの場合

このプログラムを許可するをタップして下さい。

▼WindowsDefenderの場合

アクセスを許可するをタップして下さい。

これで実行可能になりますが、検索数を100より大きくした場合にImageDownload.pyを実行した時と違う挙動があります。

▼chromedriver.exeを実行するコマンドプロンプトが最上位で立ち上がってしまいます。

最小化して立ち上げられないかやってみましたが、どうしても出来なかったので、横にどかすか最小化して対応して下さい。(^^;

▼ダウンロード中はこういう画面になってます。タイトルにDownloading…が表示されてます。

▼この表示が出ればダウンロード終了です。

OKを押せば保存したフォルダが開きます。
アプリを終了させる時はアプリ右上の×を押して下さい。

◆ImageDownloaderの配布

distフォルダごと配布する必要があります。
distフォルダをそのまま渡しても何のアプリか分からないので、ImageDownloader等にリネームしてzip等に圧縮して配布すればいいと思います。(^^♪

以下からダウンロードできます。

Download ActionDropbox – ImageDownloader.zip

解凍したImageDownloaderフォルダをお好きなところに置いて下さい。

最後に

これで娘も無事にダウンロードできてるようです。(何をダウンロードしてるんだか(^^;)
機械学習等で大量の画像が必要な方等も是非使ってみて下さい。(^^)

happyChappy(@happyChappy1115)でした。

Sponsored Link

Pocket

コメントを残す