ボタンを押すと特定のプログラムを実行する (Process2.py)
ボタンを押すことで、指定したプログラムを実行するようにしたい。
Processというデモがあるので、必要な部分だけを取り出すことにする。これはExecuteボタンを押したとき、data/echo.pyというコードを実行するようになっている。echo.pyの中身は、自分自身の説明文(__doc__)を書き出しているだけの簡単なもの。
Process.pyを読んでみると、実行するプログラム名を文字列cmdに入れてwx.Process、wx.Execute の記述によって実行させている、と理解した。
Process.pyから今回の目的に沿う部分だけ取り出したのが、以下のProcess2.py(TestPanelクラスの部分のみを掲載)。
class TestPanel(wx.Panel): def __init__(self, parent, ID, log): wx.Panel.__init__(self, parent, ID) self.log = log self.process = None self.Bind(wx.EVT_IDLE, self.OnIdle) # Make the controls prompt = wx.StaticText(self, -1, 'Command line:') self.cmd = wx.TextCtrl(self, -1, 'python -u data/echo.py') self.exBtn = wx.Button(self, -1, 'Execute') self.out = wx.TextCtrl(self, -1, '', style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_RICH2) self.Bind(wx.EVT_BUTTON, self.OnExecuteBtn, self.exBtn) # Do the layout box1 = wx.BoxSizer(wx.HORIZONTAL) box1.Add(prompt, 0, wx.ALIGN_CENTER) box1.Add(self.cmd, 1, wx.ALIGN_CENTER|wx.LEFT|wx.RIGHT, 5) box1.Add(self.exBtn, 0) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(box1, 0, wx.EXPAND|wx.ALL, 10) sizer.Add(self.out, 1, wx.EXPAND|wx.ALL, 10) self.SetSizer(sizer) self.SetAutoLayout(True) def OnExecuteBtn(self, evt): cmd = self.cmd.GetValue() self.process = wx.Process(self) self.process.Redirect(); pid = wx.Execute(cmd, wx.EXEC_ASYNC, self.process) self.log.write('OnExecuteBtn: "%s" pid: %s\n' % (cmd, pid)) def OnIdle(self, evt): if self.process is not None: stream = self.process.GetInputStream() if stream.CanRead(): text = stream.read() self.out.AppendText(text)
とりあえず動作することは確認したが、なぜかものすごく遅くなってしまったようだ。何かの処理に時間がかかっているようだ。
何なのか、まだよく分からないメソッドがあるけど、動いたからOK。