2018-04-26

wxPythonで標準出力のリダイレクト

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 ウィジェットへリダイレクトするサンプル
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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 ウィジェットへ標準出力をリダイレクト

参考サイト

  1. wxPython – Redirecting stdout / stderr | The Mouse Vs. The Python

 

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: