Python に限ったことではないのですが、問題解決のためにちょっとしたプログラムを作って、それで問題を解決できれば、やれやれなんとかなったとまずはひと安心します。そのプログラムにある程度の頻度で今後も使う需要があるならば、少し汎用化して GUI 化したくなります。私の場合、Python では、wxPython を使って GUI 化をします。
GUI 化をするにあたって、あったら便利な機能が標準出力のリダイレクトです。参考文献 [1] にピッタリなサンプルがありましたので、自分なり理解するために少しだけ書き直したサンプルを紹介します。
使用環境は以下のとおりです。今回も業務上必要だったので Windows を使っています。
- OS: Windows 7 Enterprise SP1 (x86_64)
- Python: Python 3.6.5 (amd64)
- Eclipse IDE for Java Developers, Version: Oxygen.3a Release (4.7.3a) + PyDev 6.3.2
標準出力を Text ウィジェットへリダイレクトするサンプル
import sys
import wx
class MyForm(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="TEST")
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
# ---------------------------------------------------------------------
# horizontal button bar
hbox = wx.BoxSizer(wx.HORIZONTAL)
# start
start = wx.Button(panel, wx.ID_ANY, "start")
start.Bind(wx.EVT_BUTTON, self.onClicked)
# stop
stop = wx.Button(panel, wx.ID_ANY, "stop")
stop.Bind(wx.EVT_BUTTON, self.onClicked)
hbox.Add(start, 0, wx.ALIGN_LEFT)
hbox.Add(stop, 0, wx.ALIGN_LEFT)
# ---------------------------------------------------------------------
# log window
style = wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL
log = wx.TextCtrl(panel, wx.ID_ANY, style=style)
vbox.Add(hbox, 0, wx.ALL | wx.EXPAND, 2)
vbox.Add(log, 1, wx.ALL | wx.EXPAND, 2)
panel.SetSizer(vbox)
# ---------------------------------------------------------------------
# redirect text here
sys.stdout = log
def onClicked(self, event):
msg = event.GetEventObject().GetLabel()
print("Label of pressed button = " + msg)
if __name__ == "__main__":
app = wx.App(False)
frame = MyForm().Show()
app.MainLoop()
実行例を示しました。
Text ウィジェットへ標準出力をリダイレクト
参考サイト
にほんブログ村



0 件のコメント:
コメントを投稿