Pythonでコマンドプロンプトにサヨナラする(2)
前回の記事では、tkinterを使ってMsgBox、InputBoxとほぼ同等の入出力が簡単にできるPythonプログラムを紹介しました。
ただ、見た目がちょっとWindowsっぽくないんですよねw
これは、tkinter独自のダイアログを使っているためです。ExcelVBAのようなMsgBox、InputBoxが使えると、ぐっとWindowsプログラム!っていう感じになるのですが。。。
実は
ExcelVBAやWSH(Windowsスクリプト)でつかうダイアログって、その実行部分をVisualBasicのdll(ダイナミック・リンク・ライブラリ)の中に隠し持っているのです。
これを使うことができれば、Windowsっぽいプログラムができるのですが・・・・・・じゃあ、できるのでやりましょう!(笑)
分からないところは華麗にスルーしてくださいね。
準備
VisualBasicのような「.NET」向けdllを呼び出すモジュールを、Pythonに用意します。
具体的には、下記のようにコマンドプロンプトに入力して、pythonのモジュール「pythonnet」をインストールします。
pip install pythonnet
入出力 (応答プログラム)
上記でインストールしたモジュールを利用して、VisualBasicをできるようにし、そこからMsgBox、InputBoxを呼び出してみます。
import clr
clr.AddReference('Microsoft.VisualBasic')
from Microsoft.VisualBasic import Interaction
while True:
strtmp= Interaction.InputBox("文字列を入力してください", "Title")
if strtmp=="":
break
Interaction.MsgBox(strtmp, 65536, "Title")
プログラムでやってることがやや複雑なので、分からない人は「不思議な呪文」と思っていただくと、だいたい幸せになれます。
プログラムの中で、「MsgBox」「InputBox」と書いてある箇所で、入出力を行っています。
それぞれの引数は、ExcelVBAなどVisualBasicのものと同じです。
MsgBoxの2番目の引数に「65536」としているのは、表示したときに最前面にする指定です。試しに「0」にすると迷子になります。
あと、キャンセルをしたときにそれを検出するStrPtrのような関数は無さそうなので、空文字列""を検出したら終了するようにしました。
ただこの方法だと、何も入力せずOKを押した場合も終了してしまうので、あまり正しい方法では無いと思いますが。
(もっといい方法があったら教えてください…)
メモ
AddReferenceで、使いたい.NET FrameworkのMicrosoft.VisualBasic.dllを指定しています。
Microsoft.VisualBasic名前空間のInteractionクラスを使うことを、モジュールのimportをするように指定します。
MsgBoxやInputBoxは、Interactionクラスに用意されているメソッドなので、上記プログラムのように書いて使います。
ただ、この記事はオブジェクト指向のことはあまり考えないコーナーにしたいのですが、詳しく理解しようとするとどうしてもそちら側に近寄ってしまいますね。