ログファイルを選択してその内容を指定した位置に表示する(その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にとって非常に重要になると思うので、”美しく”表示する方法を追求したい。でもまだまだそのような高度なことを考えるレベルにはないので、勉強しなければ。
まだまだ道のりは長いなー。