前置き
いつもはcygwin を使っているのだが、pywinauto を使おうとしたら、なぜかできず、調べたところcygwin ではできないらしい。ctypes もできなかったのでだめっぽい。というわけでコマンドラインからpython を動かそうということになった。
install python
www.python.org
ここからpython2.7.10 Windows x86-64 MSI installer を落とした。
設定は特に変えず入れた。
環境変数に
C:\Python27 C:\Python27\Scripts
を追加
about easy_install & pip
easy_install & pip を入れようとしたらすでに入っていた。
しかしpip が古いと言われたので
$ pip install --upgrade pip
確認
$ pip -V pip 7.1.0 from C:\Python27\lib\site-packages (python 2.7)
新しくなった。
install ipython
デフォのpython は補完が弱くて死ぬのでipython を入れる。
$ pip install ipython
Collecting ipython
Using cached ipython-3.2.0-py2-none-any.whl
Installing collected packages: ipython
Successfully installed ipython-3.2.0
入った。
実行したら色もないし補完もゴミだった。
d.hatena.ne.jp
pyreadline が必要らしい。
$ pip install pyreadline
Collecting pyreadline
Installing collected packages: pyreadline
Successfully installed pyreadline-2.0
入った。強くなった。
install pywinauto
$ pip install pywinauto Collecting pywinauto Collecting pypiwin32 (from pywinauto) Downloading pypiwin32-219-cp27-none-win_amd64.whl (7.3MB) 100% |################################| 7.3MB 49kB/s Installing collected packages: pypiwin32, pywinauto Successfully installed pypiwin32-219 pywinauto-0.5.0
入った。
一回入らなくてpypi.python.org
とかgithub.com
から入れたりしたことがあったが、状況を再現できなかった。
pywin32がどうとか言われてた記憶があるので入れたかもしれない。
Python for Windows Extensions - Browse /pywin32/Build 219 at SourceForge.net
use pywinauto
$ ipython
In [1]: from pywinauto.application import Application In [2]: app = Application.start("NotePad") In [3]: app_form = app.top_window_() In [4]: app_form.Minimize() # 最小化してみる In [5]: app_form.Restore() # 戻す In [6]: app_form.print_control_identifiers() # なにがいじれるか? Control Identifiers: Edit - '' (L-32000, T-32000, R-31316, B-31476) '' '0' '1' 'Edit' () In [7]: app_form.Edit.SetText("This is a pen.") In [8]: app_form.Edit.CaptureAsImage() PIL does not seem to be installed. PIL is required for CaptureAsImage
PIL がないらしい。
install PIL on windows
$ pip install PIL Collecting PIL Could not find a version that satisfies the requirement PIL (from versions: ) Some externally hosted files were ignored as access to them may be unreliable (use --allow-external PIL to allow). No matching distribution found for PIL $ pip install PIL --allow-external PIL Collecting PIL Could not find a version that satisfies the requirement PIL (from versions: ) Some insecure and unverifiable files were ignored (use --allow-unverified PILto allow). No matching distribution found for PIL $ pip install PIL --allow-external PIL --allow-unverified PIL Collecting PIL . . . error: Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27
なんかだめっぽい。
http://aka.ms/vcpython27から Microsoft Visual C++ Compiler for Python 2.7 を落とした。
設定は変えるところがなく入れた。
retry install PIL
途中でこんな記事を見つけた。
python - About the PIL Error -- IOError: decoder zip not available - Stack Overflow
PILではなくてPillowを使うといいらしい。
$ pip uninstall PIL
$ pip install Pillow
retry pywinauto to screenshot
先ほど起動したNotePadがあるはずなのでそれ検索して再利用する
In [1]: import pywinauto In [2]: app = pywinauto.application.Application() In [3]: app_form = app.window_(title_re = u".*メモ帳.*") In [4]: app_form.Exists() Out[4]: True In [5]: app_form.CaptureAsImage().show()
Q: 真っ暗な画面が出てきた。なんで???
A: メモ帳を最小化していたからだった。どうやら最小化したままではスクリーンショットは取れないらしい。
In [1]: import pywinauto In [2]: app = pywinauto.application.Application() In [3]: app_form = app.window_(title_re = u".*メモ帳.*") In [4]: app_form.Restore() # ここで最前面でなくしてみた。 In [5]: app_form.CaptureAsImage().show()
直接描画をとってくるのではなくてあくまでそのウィンドウ範囲内の画像を撮るというようだ。
まとめ
pywinauto.controls.HwndWrapper — pywinauto 0.4.2 documentation
色々なことができるようだ。これだけあれば当初やりたかったことは問題なくできるかなというところ。
c++ で実行ファイル作ってpython やJavaで呼ぶだとか、ctype やJNAでwin32api を叩くとかいうプランも考えていたが、それより簡単にできそうなので喜ばしい限りだ。