ログファイルを選択してその内容を指定した位置に表示する(その2)

前回は、ファイルダイアログを開いてファイルを選択するところまで。今回はTextCtrlでその内容を表示する(MenuExec2.pyを修正してMenuExec3.pyとする)。MenuExec3.pyは以下の通り。

import wx
import os

wildcard = "Log files (*.log)|*.log|" \
           "All files (*.*)|*.*"

class MyApp(wx.PySimpleApp):
    def OnInit(self):
        self.Frm = wx.Frame(None, -1, "wxPython")
        
        menuBar = wx.MenuBar()
        menu1 = wx.Menu()
        menu1.Append(101, "&Show log", "")
        menu1.AppendSeparator()
        menu1.Append(103, "&Close", "Close this frame")
        menuBar.Append(menu1, "WORK")

        self.Frm.SetMenuBar(menuBar)

        self.Frm.Bind(wx.EVT_MENU, self.ExecCmd1, id=101)
        self.Frm.Bind(wx.EVT_MENU, self.CloseWindow, id=103)

        self.ShowMessage("None", "showing messages in this area.")
        
        self.Frm.Show()
        return True
    
    def ShowMessage(self, msg1, msg2):
        StTxt1 = wx.StaticText(self.Frm, -1, msg1)
        TxtCtr2 = wx.TextCtrl(self.Frm, -1,
                              style=wx.TE_MULTILINE|wx.TE_LEFT)
        TxtCtr2.AppendText(msg2)
        BxSz = wx.BoxSizer(wx.VERTICAL)
        BxSz.Add(StTxt1, 0, wx.FIXED_MINSIZE)
        BxSz.Add(TxtCtr2, 2, wx.EXPAND)
        self.Frm.SetSizer(BxSz)

    def CloseWindow(self, event):
        self.Frm.Close()

    def ExecCmd1(self, event):
#        print 'cwd: %s\n' % os.getcwd()
        dlg = wx.FileDialog(
            self.Frm, message="Choose a log file",
            defaultDir=os.getcwd(),
            defaultFile="",
            wildcard=wildcard,
            style=wx.OPEN|wx.MULTIPLE|wx.CHANGE_DIR)
        
        if dlg.ShowModal() == wx.ID_OK:
            file_name = dlg.GetFilename()
            f = open(file_name, "r")
            msg = f.read()
            f.close()
            self.ShowMessage("Here is a list", msg)
            
        dlg.Destroy()

app = MyApp()
app.MainLoop()

とりあえずの要修正は以下の2点。

  • テキストコントロールで表示したテキストの内容が上書きされているように見えるが、マウスを持っていくと古いテキストが出てくる!なんらかの方法でテキストをクリアするべき?
  • ファイルの内容を表示する範囲がうまく調整されていない。ウィンドウのサイズを手動で変えると最適化されるようだ。self.AddPendingEvent(wx.SizeEvent())を加えてもうまくいかない...。

なにかいつも同じようなところでつまずいている気がする。根本的に何かが分かってないのだろうなー。
ファイルの内容を表示したり、コマンド実行時のログを表示することは、作ろうとしているUIにとって非常に重要になると思うので、”美しく”表示する方法を追求したい。でもまだまだそのような高度なことを考えるレベルにはないので、勉強しなければ。
まだまだ道のりは長いなー。