2025/11/05(水) [n年前の日記]
#1 [tkinter] tkinterを使って縮小画像生成アプリを作成中。その2
Python + tkinter + ImageMagick を使って、親父さんのWebサイト更新作業を楽にするためのGUIアプリを作成中。
環境は Windows11 x64 25H2 + Python 3.10.10 64bit + tkinter + tkinterdnd2 0.4.3。
環境は Windows11 x64 25H2 + Python 3.10.10 64bit + tkinter + tkinterdnd2 0.4.3。
◎ ImageMagickの呼び出しでハマった :
縮小画像の作成には、ImageMagick (magick.exe) を使いたい。つまり外部コマンドを呼び出す形になる。Python の場合、subprocess なるモジュールを使えば外部コマンドを呼び出せるらしいけど…。一般的には subprosess.run(["コマンド", "オプション"]) という形になるらしい。
しかし、試してみたところ、どうも上手く行かない…。妙なエラーばかり出る…。
原因が分かった。subprocess.run() に空白を含むパスを渡そうとした際、気を効かせたつもりで「"」でパスを挟んでから渡していたのがマズかった模様。そのあたりは subprocess.run() 側でイイ感じに処理してくれるらしいので、空白を含んだパスだろうと含んでないパスだろうとそのまま渡してしまえばいい。
更に、ImageMagick に渡すオプション文字列を、空白を含めた状態で渡してしまっていたのもマズかった模様。空白を区切り文字にして文字列を分割してリストにしてから渡してみたら動いてくれた。
以下のような感じになった。
infile, outfile には空白を含んだファイルパスが入ってるけれど、そのままリストに登録して動いてくれた。また、オプション文字列は空白で分割( .split(" ") )してリストに追加している。
しかし、試してみたところ、どうも上手く行かない…。妙なエラーばかり出る…。
原因が分かった。subprocess.run() に空白を含むパスを渡そうとした際、気を効かせたつもりで「"」でパスを挟んでから渡していたのがマズかった模様。そのあたりは subprocess.run() 側でイイ感じに処理してくれるらしいので、空白を含んだパスだろうと含んでないパスだろうとそのまま渡してしまえばいい。
更に、ImageMagick に渡すオプション文字列を、空白を含めた状態で渡してしまっていたのもマズかった模様。空白を区切り文字にして文字列を分割してリストにしてから渡してみたら動いてくれた。
以下のような感じになった。
im_opt = "-colorspace RGB -filter Lanczos -define filter:blur=.9891028367558475 -distort Resize {SIZE}x{SIZE} -colorspace sRGB -quality 90"
def get_resize_command(infile: str, outfile: str, size: int):
"""ImageMagickを使って画像をリサイズするためのコマンドリストを取得"""
cmd = []
cmd.append("magick")
cmd.append(infile)
optstr = im_opt.replace("{SIZE}", str(size)).split(" ")
for s in optstr:
cmd.append(s)
cmd.append(outfile)
return cmd
infile, outfile には空白を含んだファイルパスが入ってるけれど、そのままリストに登録して動いてくれた。また、オプション文字列は空白で分割( .split(" ") )してリストに追加している。
[ ツッコむ ]
#2 [windows] 親父さん用PCにPythonとImageMagickをインストールしておいた
親父さん用PC(Windows11 x64 25H2機)に、Python と ImageMgaick をインストールしておいたことをメモ。これで一々Pythonスクリプトをexe化してからコピーしなくても済むだろう…。
◎ Pythonのインストール :
よく分からないまま、Python を3種類インストールしてしまった…。
後になって調べてみたら、Python install manager は Python 3.14 の公開直後に配布が始まったばかりの仕組みらしくて、今後はこの形式で Python のインストールをしていく予定らしい。ただ、公開されたばかりの仕組みだから、まだ不具合が残ってる可能性もある、という話も見かけた。
Microsoft Store経由でインストールされる版は Pythonインストーラと保存場所が色々違うようで、ユーザーが覗くことすらできない WindowsAppフォルダにインストールされたりするらしい。そのことでトラブルが起きる可能性があるから避けるべき、ということになっているらしい。
やっちまった感じがする…。既存のPythonインストーラだけを使ってインストールを済ませておくべきだった…。後でアンインストールできないか試してみないと…。
- Python install manager (python-manager-25.0.msix) を入手して実行。Python 3.14 をインストール。
- Python 3.13.9 64bit のセットアップファイル (python-3.13.9-amd64.exe)を入手してインストール。C:\Python\Python3.13\ にインストールしておいた。これは環境変数PATHの最初に追加されたので、python と打てば、この Python 3.13.9 が実行されるはず。
- cmd.exe 上で python3 と打つと Microsoft Store が開いて Python の入手ページが表示される。Python 3.13 が入手できるようなので「入手」と書いてあるボタンをクリックしたけれど、これはどこにインストールされてしまったのか分からない…。
後になって調べてみたら、Python install manager は Python 3.14 の公開直後に配布が始まったばかりの仕組みらしくて、今後はこの形式で Python のインストールをしていく予定らしい。ただ、公開されたばかりの仕組みだから、まだ不具合が残ってる可能性もある、という話も見かけた。
Microsoft Store経由でインストールされる版は Pythonインストーラと保存場所が色々違うようで、ユーザーが覗くことすらできない WindowsAppフォルダにインストールされたりするらしい。そのことでトラブルが起きる可能性があるから避けるべき、ということになっているらしい。
やっちまった感じがする…。既存のPythonインストーラだけを使ってインストールを済ませておくべきだった…。後でアンインストールできないか試してみないと…。
◎ ImageMagickのインストール :
ImageMagick は、ImageMagick-7.1.2-8-Q16-HDRI-x64-dll.exe を入手してインストールした。デフォルトでは C:\Program Files\ 以下にインストールされるけど、今回は C:\Prog\ 以下にインストールした。パスに空白文字が含まれていると不具合に遭遇しそうなので…。
環境変数PATH に追加されたので、cmd.exe 上で magick.exe が呼び出せる。magick --version と打ったらバージョンが表示された。
環境変数PATH に追加されたので、cmd.exe 上で magick.exe が呼び出せる。magick --version と打ったらバージョンが表示された。
[ ツッコむ ]
以上、1 日分です。