Windowsのプログラムを起動する

wxPythonで作成したGUI画面から、windowsのプログラムを選択して起動するテスト。
popen2モジュールを使って昔、同様のことをしていたので思い出しつつ、ちゃんと動くかやってみる。GUI画面はやっつけで下のようにしてみた。

「選択」ボタンを押すとファイルダイアログが開くので、プログラムファイル(拡張子がexeのファイル)をまず選択する。次に「起動」ボタンを押すと、選択したプログラムがスタートする。「選択」した時点でプログラムファイルの絶対パスが得られるが、これをそのままpopen2.popen3の引数で渡してもうまくいかなかった。絶対パスは、ダブルコーテーションで前後を囲まなければいけないようだ。コマンドプロンプトでテストしてやっと分かった。

windowsプログラムは起動できるが、このGUI画面はなんか不安定だ。マウスでGUI画面を移動させると、下のように画面の軌跡が残る。以前もこんなことがあった記憶があるようなないような。やはり書き方が悪いのかな。py2exeでモジュール化すればこんなことは起こらなくなるので、まあいいか。いや、よくない。

以下、今回のソース。

# coding: utf-8
import wx
import sys
import popen2

class MainFrame(wx.Frame):
    def __init__(self, id, title):
        width, height = 300, 100
        wx.Frame.__init__(self, id, title=u"プログラムを起動する",
                          size=wx.Size(width, height))
        self.Pan = wx.Panel(self, -1)
        Hsizer = wx.BoxSizer(wx.HORIZONTAL)
        Vsizer = wx.BoxSizer(wx.VERTICAL)

        self.RBtn0 = wx.Button(self.Pan, -1, u"選択")
        self.RBtn1 = wx.Button(self.Pan, -1, u"起動")
        self.RBtn0.Bind(wx.EVT_BUTTON, self.selectProgram)
        self.RBtn1.Bind(wx.EVT_BUTTON, self.startProgram)

        Hsizer.Add(self.RBtn0, 0, wx.ALL, 2)
        Hsizer.Add(self.RBtn1, 0, wx.ALL, 2)
        self.Pan.SetSizer(Hsizer)
        Hsizer.Fit(self.Pan)

    def selectProgram(self, event):
        dlg = wx.FileDialog(self, message="Please choose program")
        ansBtn = dlg.ShowModal()
        self.ProgName = '"'+dlg.GetPath()+'"'
        if ansBtn == wx.ID_OK:
            pass
        dlg.Destroy()

    def startProgram(self, inputZipCode):
        popen2.popen3(self.ProgName)
        print self.ProgName

class Application(wx.App):
    def OnInit(self):
        frame = MainFrame(None, -1)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = Application()
app.MainLoop()