2015/06/18(木) [n年前の日記]
#1 [python] Visual Studio に PTVS をインストール。
Visual Studio 上で Python開発ができるようになる、PTVS (Python Tools for Visual Studio) という Visual Studio 用の拡張機能?があるらしく。試しに VS2013(Visual Studio Community 2013)にインストールしてみたり。
_Python Tools for Visual Studio - Home 経由で _Releases - Microsoft/PTVS に辿り着き、PTVS 2.2 RC2 ( PTVS 2.2 RC2 VS 2013.msi ) をDLして実行してインストール。
VS2013 の、ツール → オプション → Python Tools → Environment Options で、既にインストール済みだった Python 2.7 を指定。また、各プロジェクトのプロパティでも、どの Python を使うのか指定できる。
プロジェクト新規作成時、テンプレートの中に Python が追加された。
少し触ってみたけど、たしかに結構補完が効くような感じ。いつも Visual Studio を使ってる人は、コレを使えばイイ感じなのかも。
ただ、「label」と打ちたいのに、補完されて「Label」になってしまったり等、ちょっと使いづらい瞬間も。
_Python Tools for Visual Studio - Home 経由で _Releases - Microsoft/PTVS に辿り着き、PTVS 2.2 RC2 ( PTVS 2.2 RC2 VS 2013.msi ) をDLして実行してインストール。
VS2013 の、ツール → オプション → Python Tools → Environment Options で、既にインストール済みだった Python 2.7 を指定。また、各プロジェクトのプロパティでも、どの Python を使うのか指定できる。
プロジェクト新規作成時、テンプレートの中に Python が追加された。
少し触ってみたけど、たしかに結構補完が効くような感じ。いつも Visual Studio を使ってる人は、コレを使えばイイ感じなのかも。
ただ、「label」と打ちたいのに、補完されて「Label」になってしまったり等、ちょっと使いづらい瞬間も。
[ ツッコむ ]
#2 [python] IronPythonをインストール
IronPython は、.NET Framework を Python から呼べるようにした Python。という認識でいいのかな。C# で実装されてるから .NETアプリ (.exe) に変換できるんだぜ、てな話を見かけて興味が湧いたので少し触ってみようかと。
_IronPython - Home から IronPython-2.7.5.msi をDLして実行してインストール。今回は C:\Python\IronPython2.7\ にインストールした。パスに空白が入ってると後で面倒臭いので、空白は省いた場所にインストールしておく。
Visual Studio の設定を変更。IronPython 2.7 を使うようにする。この設定変更は、Visual Studio を再起動しないと反映されないっぽい。
_C#のコードを参考にしてみよう をコピペして実行してみたら、ウインドウが表示された。たしかに、.NET が使われることで Form が表示されてるっぽい。
_IronPython - Home から IronPython-2.7.5.msi をDLして実行してインストール。今回は C:\Python\IronPython2.7\ にインストールした。パスに空白が入ってると後で面倒臭いので、空白は省いた場所にインストールしておく。
Visual Studio の設定を変更。IronPython 2.7 を使うようにする。この設定変更は、Visual Studio を再起動しないと反映されないっぽい。
_C#のコードを参考にしてみよう をコピペして実行してみたら、ウインドウが表示された。たしかに、.NET が使われることで Form が表示されてるっぽい。
◎ IronPython用のPythonスクリプトをexe化。 :
2015/06/18現在は、IronPython に同梱されてる pyc.py を使えばexe化できる。exe化する際の指定は以下。
試してみた。自分の環境では、C:\Python\IronPython2.7\ に IronPython をインストールしてある。
exe を実行したら、フォームが表示された。たしかに、exe化できたっぽい。
2つのファイルサイズを合わせても15KB。これがもし、Ruby + Ocra で exe化した日には、ファイルサイズは大きいわ、起動は遅いわで…。それと比べると、LLで書いてあるのに、このサイズの exe になるのはありがたい、かもしれない。 *1
でも、ぶっちゃけ、Windowsアプリを簡単に作りたいなら、それこそ C# あたりで書いちゃうほうがいいよな…。
とは言え、選択肢が色々あるのはいいことだなと。これが Ruby だったら、Windows用のGUIアプリを書こうとしても選択肢が無いし…。 *2 Python はまだ恵まれてるほうなのかしらん。
ipy.exe IronPythonインストール場所\Tools\Scripts\pyc.py /target:exe /main:hoge.py hoge.py
- コンソールアプリにしたい場合は、/target:exe を指定。
- GUIアプリにしたい場合は、/target:winexe を指定。
試してみた。自分の環境では、C:\Python\IronPython2.7\ に IronPython をインストールしてある。
> C:\Python\IronPython2.7\ipy.exe C:\Python\IronPython2.7\Tools\Scripts\pyc.py /target:winexe /main:PythonApplicationTest01.py PythonApplicationTest01.py
Input Files: PythonApplicationTest01.py Output: PythonApplicationTest01 Target: WindowApplication Platform: ILOnly Machine: I386 Threading: STA Compiling... Saved to PythonApplicationTest01これで、以下の2つのファイルが出来上がった。
PythonApplicationTest01.dll PythonApplicationTest01.exe
exe を実行したら、フォームが表示された。たしかに、exe化できたっぽい。
2つのファイルサイズを合わせても15KB。これがもし、Ruby + Ocra で exe化した日には、ファイルサイズは大きいわ、起動は遅いわで…。それと比べると、LLで書いてあるのに、このサイズの exe になるのはありがたい、かもしれない。 *1
でも、ぶっちゃけ、Windowsアプリを簡単に作りたいなら、それこそ C# あたりで書いちゃうほうがいいよな…。
とは言え、選択肢が色々あるのはいいことだなと。これが Ruby だったら、Windows用のGUIアプリを書こうとしても選択肢が無いし…。 *2 Python はまだ恵まれてるほうなのかしらん。
◎ さすがにTkinterは動かないらしい。 :
IronPython で Tkinter は使えないのかなとググってみたけど、英語フォーラムで「動くわけねえだろ」てなやり取りが。まあ、.NET 使おうぜ、ってことですわな。せっかく .NET用に作ったんだし。でもそれだと、Windows専用アプリになるよなあ…。
*NIX や Mac でも動く Python + GUI となると…。やっぱり Python 2.7 + Tkinter でやれないか、ひとまず検討してみたほうがいいのかな。
*NIX や Mac でも動く Python + GUI となると…。やっぱり Python 2.7 + Tkinter でやれないか、ひとまず検討してみたほうがいいのかな。
[ ツッコむ ]
#3 [python] Python + Tkinterを勉強中
ググってたら、どうやら Tkinter はキャンバス上に表示した画像をマウスドラッグで移動することが簡単にできるらしいと知り。昨日作ったようなツールを比較的簡単に書けるのかなと興味が湧いたので少し勉強中。
とりあえず画像を表示してドラッグ移動することはできたので、Frame に、メニューその他を追加できるかどうか試したり。
とりあえず画像を表示してドラッグ移動することはできたので、Frame に、メニューその他を追加できるかどうか試したり。
◎ underの指定。 :
メニューバー(Menu)追加時の under だか underline だかの指定がよく分からなかったけど。
_Tkinter ウィンドウにメニューをつける。 - Cassiopeiaの日記
を眺めて、そういうことかと。要するに、メニューに表示する文字列内の、何番目の文字を Alt + 英数字キーに割り当てるか、という指定なのですな。
# 文字は、0,1,2,3番目、と数える。 # under=0 が指定されてるから、「Save」の、0番目の文字の「S」が使われる。 menu_file.add_command(label="Save", under=0, command = self.save_project, accelerator="Ctrl+S") # under=5 が指定されてるから、「Save as...」の、5番目の文字の「a」が使われる。 menu_file.add_command(label="Save as...", under=5, command = self.save_as_project, accelerator="Shift+Ctrl+S") # under=1 が指定されてるから、「Exit」の、1番目の文字の「x」が使われる。 menu_file.add_command(label="Exit", under=1, command = self.quit, accelerator="Ctrl+Q")
◎ Tkinterのショートカットキー関係。 :
Shift + Ctrl + 英字キーを割り当てる時、英字キーは大文字で指定しておかないといけない。
以下は Tcl/Tkの解説だけど、参考になりました。ありがたや。
_イベント処理
ここでちと気になる動作が。
自分の環境は、CapsLockキーをCtrlキーとして使う設定にしてあるのだけど。どうやら Tkinter (Python 2.7.10 同梱版)では、Shift + Ctrl + 英数字キーをバインドした際、CapsLock を Ctrl として扱ってくれないようで。
これが単に、Ctrl + 英数字キーのバインドだったら、CapsLock(Ctrl化) + 英数字キーも反応してくれるのだけど。ちょっとよく分からない動作だなと。
self.bind_all("<Shift-Control-S>", self.save_as_project) self.bind_all("<Control-q>", self.quit)Shiftキーが押されることで、大文字が入力されるから、とのこと。
以下は Tcl/Tkの解説だけど、参考になりました。ありがたや。
_イベント処理
次の例は Contorol キー、Shift キー、ALT キーを扱う例です。
1 : bind . <Control-ButtonPress-1> {puts "Control and mouse button 1 is pressed."}
2 : bind . <Shift-KeyPress-A> {puts "Shift-A is pressed."}
3 : bind . <Alt-KeyPress-b> {puts "Alt-B is pressed."}
4 : bind . <Shift-Control-KeyPress-C> {puts "Shift-Control-C is pressed."}
Alt キーのときは「b」としているのに、 Shift キーが関わっているときには「A」のように大文字にしています。 これは Shift キーと同時にアルファベットキーを押すと大文字になるからですね。 したがって、キーボードの Caps Lock をオンにすると、 上記のキーに関するイベントは反応しなくなります (大文字と小文字が逆になるからです)。イベント処理 より
ここでちと気になる動作が。
自分の環境は、CapsLockキーをCtrlキーとして使う設定にしてあるのだけど。どうやら Tkinter (Python 2.7.10 同梱版)では、Shift + Ctrl + 英数字キーをバインドした際、CapsLock を Ctrl として扱ってくれないようで。
- Shift + CapsLock(Ctrl化) + 英数字キーは無反応。
- Shift + Ctrl(本物のCtrl) + 英数字キーなら反応する。
これが単に、Ctrl + 英数字キーのバインドだったら、CapsLock(Ctrl化) + 英数字キーも反応してくれるのだけど。ちょっとよく分からない動作だなと。
◎ 終了のさせ方。 :
_python - Close a tkinter window? - Stack Overflow
によると、sysy.exit(0) でも終了できるけど、root.quit()、self.parent.quit() でも終了できるらしい。後者は、 root = Tk() とかしてないとダメだけど。
[ ツッコむ ]
#4 [python] Python + Tkinter でドラッグアンドドロップ
Windowsのエクスプローラから、Python + Tkinter で表示してるウインドウにファイルをD&Dして、ファイルパスを取得したいなと。
ググってみたら、Python + Tkinter、というか Tk は、標準ではそんな機能を持ってないらしい。
しかし、ちょっと頑張ればなんとかなるのかもしれないという話もあるようで。せっかく調べたので、そのあたりをメモ。
環境は Windows7 x64 + Python 2.7.10。
ググってみたら、Python + Tkinter、というか Tk は、標準ではそんな機能を持ってないらしい。
しかし、ちょっと頑張ればなんとかなるのかもしれないという話もあるようで。せっかく調べたので、そのあたりをメモ。
環境は Windows7 x64 + Python 2.7.10。
◎ Win32 APIとやらを使う。 :
_Python+TkでD&D - MasaHeroの日記
で解説されてた。ソースをコピペして試してみたら、たしかにD&Dしたファイルのパスを取得することができた。素晴らしい…。
もちろん、この方法だと Windows専用アプリになるわけで。であれば、もしかすると IronPython + .NET Framework で作ってしまうという選択肢もアリになってくるのかしら。Tkinter を使うことで、Windows以外の環境でも動かせる可能性が、という話は無くなってしまうよなと。
もちろん、この方法だと Windows専用アプリになるわけで。であれば、もしかすると IronPython + .NET Framework で作ってしまうという選択肢もアリになってくるのかしら。Tkinter を使うことで、Windows以外の環境でも動かせる可能性が、という話は無くなってしまうよなと。
◎ TkDNDを使う。 :
TkだけではD&Dに対応してないけど、Tkの拡張として TkDND なるものがあって、ソレを使うとD&Dができるらしい。
_Scripting Laboratory: tkDND
TkDNDは、 _TkDND download | SourceForge.net から入手できる。 _Files → _Windows Binaries → _TkDND 2.8 と辿って、tkdnd2.8-win32-ix86.tar.gz を入手。
解凍したら、以下のファイルが入っていた。
インストール方法がさっぱり分からなくて困ったけれど。 _tkinterでドラッグ&ドロップ - None is None is None でインストール場所について言及しているのを発見。
要は、Python2.7インストール場所\tcl\ フォルダの下に tkdnd というフォルダを作って、その中に先ほど入手した *.dll、*.tcl を全部突っ込めばいいらしい。
*.dll だけあればいいんじゃないのと最初は思ったけど、どうも pkgIndex.tcl というファイルで、「この拡張を使う時は、このファイルを使え」的な情報が書かれている気配があって。よく分からないから *.tcl も全部突っ込む。
さらに、Python + Tkinter から使うためには、TkDND のラッパーとやらが必要になるそうで。それについては、 _Drag and drop in Windows - Google グループ 経由で、 _TkinterDnD download | SourceForge.net にサンプルとラッパーがあると知った。Files → TkinterDnD2 と辿って、TkinterDnd2-0.1.zip を入手。
解凍すると、中に色々ファイルが。
test.py を実行したら…。たしかに、エクスプローラからファイルをD&Dしてファイルのパスを取得することができた。
しかし、このままではちと使いづらい気もする。Pythonインストールフォルダに件のファイル群を手作業でコピーさせるのってどうなんだろうと。自分の環境だけで使う分にはいいけれど、他の環境でも使えるようにと考え始めると、ソレってちょっとどうなのよと。
_python drag and drop explorer files to tkinter entry widget - Stack Overflow で、またちょっと違うラッパー、untested_tkdnd_wrapper.py が公開されてた。untested_tkdnd_wrapper.py を呼び出す側のスクリプト内で、TkDNDがどこにあるかを指定できるらしい。
試しに、untested_tkdnd_wrapper.py、及び、呼び出すスクリプトがある場所に、tkdnd というフォルダを作って、TkDND の *.dll、*.tcl をコピーして。呼び出す側のスクリプトの最初のあたりを、
これで試してみたところ、こちらもD&Dでファイルパスを取得できた。
つまり、ラッパーの書き方次第で、スクリプトと一緒に関連ファイルをフォルダごと同梱して使える状態にできそうだなと。
ただ、ライセンスはどうなるのか分かってないけど。
_TkDND 自体は、BSD License と書いてあるな…。
_Scripting Laboratory: tkDND
TkDNDは、 _TkDND download | SourceForge.net から入手できる。 _Files → _Windows Binaries → _TkDND 2.8 と辿って、tkdnd2.8-win32-ix86.tar.gz を入手。
解凍したら、以下のファイルが入っていた。
└─tkdnd2.8 libtkdnd2.8.dll pkgIndex.tcl tkdnd.tcl tkdnd_compat.tcl tkdnd_generic.tcl tkdnd_macosx.tcl tkdnd_unix.tcl tkdnd_windows.tcl
インストール方法がさっぱり分からなくて困ったけれど。 _tkinterでドラッグ&ドロップ - None is None is None でインストール場所について言及しているのを発見。
要は、Python2.7インストール場所\tcl\ フォルダの下に tkdnd というフォルダを作って、その中に先ほど入手した *.dll、*.tcl を全部突っ込めばいいらしい。
*.dll だけあればいいんじゃないのと最初は思ったけど、どうも pkgIndex.tcl というファイルで、「この拡張を使う時は、このファイルを使え」的な情報が書かれている気配があって。よく分からないから *.tcl も全部突っ込む。
さらに、Python + Tkinter から使うためには、TkDND のラッパーとやらが必要になるそうで。それについては、 _Drag and drop in Windows - Google グループ 経由で、 _TkinterDnD download | SourceForge.net にサンプルとラッパーがあると知った。Files → TkinterDnD2 と辿って、TkinterDnd2-0.1.zip を入手。
解凍すると、中に色々ファイルが。
D:. │ test.py │ TkinterDnD.html │ └─TkinterDnD2 TkinterDnD.py __init__.py
test.py を実行したら…。たしかに、エクスプローラからファイルをD&Dしてファイルのパスを取得することができた。
しかし、このままではちと使いづらい気もする。Pythonインストールフォルダに件のファイル群を手作業でコピーさせるのってどうなんだろうと。自分の環境だけで使う分にはいいけれど、他の環境でも使えるようにと考え始めると、ソレってちょっとどうなのよと。
_python drag and drop explorer files to tkinter entry widget - Stack Overflow で、またちょっと違うラッパー、untested_tkdnd_wrapper.py が公開されてた。untested_tkdnd_wrapper.py を呼び出す側のスクリプト内で、TkDNDがどこにあるかを指定できるらしい。
試しに、untested_tkdnd_wrapper.py、及び、呼び出すスクリプトがある場所に、tkdnd というフォルダを作って、TkDND の *.dll、*.tcl をコピーして。呼び出す側のスクリプトの最初のあたりを、
os.environ['TKDND_LIBRARY'] = DIRECTORYTOTHETKDNDBINARY ↓ os.environ['TKDND_LIBRARY'] = ".\\tkdnd"と修正。
これで試してみたところ、こちらもD&Dでファイルパスを取得できた。
つまり、ラッパーの書き方次第で、スクリプトと一緒に関連ファイルをフォルダごと同梱して使える状態にできそうだなと。
ただ、ライセンスはどうなるのか分かってないけど。
_TkDND 自体は、BSD License と書いてあるな…。
[ ツッコむ ]
#5 [python] PyOpenGLをインストールしようとして少しハマった
Windows7 x64 + Python 2.7.10 の環境に、PyOpenGL をインストールしようとしたら、少しだけハマった。
まずは公式のやり方でインストールを試みた。(このやり方だと不具合が出ることに注意。)
PyOpenGL-Demo は、以下にインストールされた。
しかし、PyOpenGL-DEMO を動かそうとしたらエラーが出た。
_python 2.7 - PyOpenGL glutInit NullFunctionError - Stack Overflow によると、どうやら公式のバイナリ ―― pip でインストールできる版には不具合があるらしい。 _Python Extension Packages for Windows - Christoph Gohlke からDLできる版を使えば解決するかもしれない、とのこと。
以下の2つをDL。
以下を実行してインストール。
PyOpenGL-Demo については、 _PyOpenGL-Demo 3.0.1b1 : Python Package Index から、PyOpenGL-Demo-3.0.1b1.zip をDLして解凍。中に入ってる setup.py でインストール作業ができる。
この版なら、PyOpenGL-Demo内の各スクリプトも動いてくれた。
まずは公式のやり方でインストールを試みた。(このやり方だと不具合が出ることに注意。)
pip install PyOpenGL pip install PyOpenGL_accelerate pip install PyOpenGL-Demoそれぞれ、以下がDLされて、インストールされたらしい。
PyOpenGL-3.1.0.tar.gz PyOpenGL-accelerate-3.1.0.tar.gz PyOpenGL-Demo-3.0.0.tar.gz
PyOpenGL-Demo は、以下にインストールされた。
C:\Python2.7インストール場所\Lib\site-packages\PyOpenGL-Demo
しかし、PyOpenGL-DEMO を動かそうとしたらエラーが出た。
C:\Python\Python27\Lib\site-packages\PyOpenGL-Demo\redbook> py hello.py Traceback (most recent call last): File "hello.py", line 97, in <module> glutInit(sys.argv) File "C:\Python\Python27\Lib\site-packages\OpenGL\GLUT\special.py", line 333, in glutInit _base_glutInit( ctypes.byref(count), holder ) File "C:\Python\Python27\Lib\site-packages\OpenGL\platform\baseplatform.py", line 407, in __call__ self.__name__, self.__name__, OpenGL.error.NullFunctionError: Attempt to call an undefined function glutInit, check for bool(glutInit) before ca lling
_python 2.7 - PyOpenGL glutInit NullFunctionError - Stack Overflow によると、どうやら公式のバイナリ ―― pip でインストールできる版には不具合があるらしい。 _Python Extension Packages for Windows - Christoph Gohlke からDLできる版を使えば解決するかもしれない、とのこと。
以下の2つをDL。
PyOpenGL_accelerate-3.1.1a1-cp27-none-win32.whl PyOpenGL-3.1.1a1-cp27-none-win32.whl
以下を実行してインストール。
pip install PyOpenGL-3.1.1a1-cp27-none-win32.whl pip install PyOpenGL_accelerate-3.1.1a1-cp27-none-win32.whl
PyOpenGL-Demo については、 _PyOpenGL-Demo 3.0.1b1 : Python Package Index から、PyOpenGL-Demo-3.0.1b1.zip をDLして解凍。中に入ってる setup.py でインストール作業ができる。
py setup.py install
この版なら、PyOpenGL-Demo内の各スクリプトも動いてくれた。
[ ツッコむ ]
以上、1 日分です。