2022/03/30(水) [n年前の日記]
#1 [python] tkinterについて勉強中
昨日に引き続き、GIMP + Python-Fu で行っていた処理を、Python + pycairo で行うようにスクリプトを書き直しているところ。
描画処理については、ほぼ再現できた気がする。GIMP + Python-Fu で処理した場合、画像を一枚生成するのに20〜30秒ぐらいかかっていたけど、Python + pycairo で描画してみたら一瞬で生成してくれた。
せっかくだから、得られた画像を png 等で保存できるようにしたい。しかし、tk.filedialog.asksaveasfilename() を使って、保存ダイアログを表示させたところで、妙な動作をしていることに気が付いた。ファイルダイアログを呼び出すためのボタンを押した後、ファイルダイアログを閉じても、呼び出し元のボタンが押し込まれたままになってしまう。
ググったところ、生成した tk.Button() に対して、.bind() を使って、押した際に呼ばれる関数を指定していたのがよろしくなかったらしい。tk.Button() を生成する際に、command=hoge を渡しておけば、そういった症状は出ない模様。何でも、ボタンを押して関数が呼ばれた際、その関数の中で処理に時間がかかってしまうと妙なことになるそうで…。
それとは別に。pycairo の Surface を .write_to_png() を使ってpng保存しようとしたら、Python 3.9.12 64bit + pycairo 1.21.0 では動作したものの、Python 2.7.18 32bit + pycairo 1.8.10 ではエラーになった。もしかすると、Python 2.7.18 にインストールしてある pycairo はバージョンが古くて .write_to_png() が実装されてないか、動作に問題があるのかなと…。とりあえず、pycairo の Surface から Pillow の Image を一旦作って、Pillow側でpng保存を ―― im.save() のような記述にして保存することにした。
描画処理については、ほぼ再現できた気がする。GIMP + Python-Fu で処理した場合、画像を一枚生成するのに20〜30秒ぐらいかかっていたけど、Python + pycairo で描画してみたら一瞬で生成してくれた。
せっかくだから、得られた画像を png 等で保存できるようにしたい。しかし、tk.filedialog.asksaveasfilename() を使って、保存ダイアログを表示させたところで、妙な動作をしていることに気が付いた。ファイルダイアログを呼び出すためのボタンを押した後、ファイルダイアログを閉じても、呼び出し元のボタンが押し込まれたままになってしまう。
ググったところ、生成した tk.Button() に対して、.bind() を使って、押した際に呼ばれる関数を指定していたのがよろしくなかったらしい。tk.Button() を生成する際に、command=hoge を渡しておけば、そういった症状は出ない模様。何でも、ボタンを押して関数が呼ばれた際、その関数の中で処理に時間がかかってしまうと妙なことになるそうで…。
それとは別に。pycairo の Surface を .write_to_png() を使ってpng保存しようとしたら、Python 3.9.12 64bit + pycairo 1.21.0 では動作したものの、Python 2.7.18 32bit + pycairo 1.8.10 ではエラーになった。もしかすると、Python 2.7.18 にインストールしてある pycairo はバージョンが古くて .write_to_png() が実装されてないか、動作に問題があるのかなと…。とりあえず、pycairo の Surface から Pillow の Image を一旦作って、Pillow側でpng保存を ―― im.save() のような記述にして保存することにした。
◎ 2022/04/02追記。 :
pycairo の .write_to_png() が Python 2.7.18 + pycairo 1.8.10 で動くかどうか試してたけど、最低限の処理しかしないスクリプトを書いて試したら動いてしまった。変だな…。何が原因でエラーを出すのだろう…。まあ、Pillow 側で保存できてるから、このままにしておこう…。
[ ツッコむ ]
以上、1 日分です。