wxPython 入門 (9)
wPython.org の Getting Started をサカナに第九弾。Getting started with wxPython でいうと、2.4 まで終わらせて、とりあえず、ここまで書けるようになったというソースコード。メニューは、__init__ の中に詰め込まないで別のメソッドにまとめた方がいいかもねとか、そういうことまではしていないので __init__ がやけに長いので、SetupMenu メソッドを作ってまとめておくことにした。ということで、ここまでのソースコードのまとめ。wxPython 入門 (1) フレームとアプリケーションwxPython 入門 (2) テキストコントロールwxPython 入門 (3)文字色、背景色とフォントwxPython 入門 (4) メニューとステータスバーwxPython (5) イベントとバインドwxPython (6) (5) のソースコードwxPython (7) プログラムの終了とダイアログの表示wxPython (8) ファイルダイアログとファイルの読み込み# -*- coding: utf-8 -*-import wximport osclass MyFrame(wx.Frame): """ 簡易エディタ """ def __init__(self, parent, title): wx.Frame.__init__(self, parent, title=title, size=(400,300)) self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE) # メニューバーを作成する self.SetupMenu() # ステータスバーを作成する self.CreateStatusBar() # 表示 self.Show(True) def SetupMenu(self): # 個々のメニューオブジェクトを作成する # ファイルメニュー、編集メニュ、書式メニュー、表示メニュー、ヘルプメニューの各メニューオブジェクトを作成 file_menu= wx.Menu() edit_menu = wx.Menu() help_menu = wx.Menu() # 各メニュー毎にメニューアイテムを作っていく # ファイルメニュー menuNew = file_menu.Append(wx.ID_NEW, "新規作成 (&N)", "ファイルを新しく作ります") menuOpen = file_menu.Append(wx.ID_OPEN, "開く (&F)", "ファイルを開きます") menuSave = file_menu.Append(wx.ID_SAVE, "上書き保存 (&S)", "編集中のファイルに上書きで保存します") menuSaveas = file_menu.Append(wx.ID_SAVEAS, "名前を付けて保存 (&A)", "新しく名前をつけてで保存します") file_menu.AppendSeparator() # メニューセパレータ menuExit = file_menu.Append(wx.ID_EXIT, "終了 (&X)", "簡易エディタの終了します") # 編集メニュー menuUndo = edit_menu.Append(wx.ID_UNDO, "元に戻す (&U)", "編集を元に戻します") menuCut = edit_menu.Append(wx.ID_CUT, "切り取り (&T)", "選択箇所を切り取ります") menuCopy = edit_menu.Append(wx.ID_COPY, "コピー (&V)", "選択箇所をコピーします") menuPaste = edit_menu.Append(wx.ID_PASTE, "貼り付け (&P)","切り取られた箇所を貼り付けます") # ヘルプメニュー menuHelp = help_menu.Append(wx.ID_HELP, "ヘルプの表示 (&H)", "プログラムのヘルプを表示します") menuAbout = help_menu.Append(wx.ID_ABOUT, "バージョン情報 (&A)", "プログラムのヘルプを表示します") # メニューバーを作成し、個々のメニューをメニューバーに追加していく menuBar = wx.MenuBar() menuBar.Append(file_menu,"ファイル (&F)") menuBar.Append(edit_menu, "編集 (&E)") menuBar.Append(help_menu, "ヘルプ (&H)") # 個々のメニューアイテムを、イベントハンドラーにバインドする self.Bind(wx.EVT_MENU, self.OnNew, menuNew) self.Bind(wx.EVT_MENU, self.OnOpen, menuOpen) self.Bind(wx.EVT_MENU, self.OnSave, menuSave) self.Bind(wx.EVT_MENU, self.OnSaveas, menuSaveas) self.Bind(wx.EVT_MENU, self.OnExit, menuExit) self.Bind(wx.EVT_MENU, self.OnUndo, menuUndo) self.Bind(wx.EVT_MENU, self.OnCut, menuCut) self.Bind(wx.EVT_MENU, self.OnCopy, menuCopy) self.Bind(wx.EVT_MENU, self.OnPaste, menuPaste) self.Bind(wx.EVT_MENU, self.OnHelp, menuHelp) self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout) # メニューバーを Frame にセットする self.SetMenuBar(menuBar) def OnNew(self, event): print "Select New" def OnOpen(self,e): """ ファイルを開く """ # ホームディレクトリを開くようにする self.dirname = os.getenv("HOME") or os.getenv("HOMEDRIVE") + os.getenv("HOMEPATH") # フィルタ文字列のセット filters = 'Python files (*.py;*.pyw) | *.py;*.pyw | txt files (*.txt)|*.txt| All files (*.*)|*.*' dlg = wx.FileDialog(self, "ファイルを選択してください", self.dirname, "デフォルトのファイル名", filters, wx.OPEN) if dlg.ShowModal() == wx.ID_OK: self.filename = dlg.GetFilename() self.dirname = dlg.GetDirectory() f = open(os.path.join(self.dirname, self.filename), 'r') self.control.SetValue(f.read()) f.close() dlg.Destroy() def OnSave(self, event): print "Select Save" def OnSaveas(self, event): print "Select Save As" def OnUndo(self, event): print "Select Undo" def OnCut(self, event): print "Select Cut" def OnCopy(self, event): print "Select Copy" def OnPaste(self, event): print "Select Paste" def OnHelp(self, event): print "Select Help" def OnAbout(self, event): # OK ボタンがついたメッセージダイアログを表示する。 # dlg = wx.MessageDialog( self, "この簡易エディタはサンプルプログラムです。", "簡易エディタ") dlg = wx.MessageDialog( self, "この簡易エディタはサンプルプログラムです。", "簡易エディタ", wx.OK|wx.STAY_ON_TOP) # ダイアログの表示 dlg.ShowModal() # ダイアログの終了時にダイアログオブジェクトを破棄する #dlg.Destroy() self.dlg = dlg def OnExit(self, event): # OK ボタンがついたメッセージダイアログを表示する。 dlg = wx.MessageDialog( self, "簡易エディタを終了してもよいですか", "簡易エディタ", wx.YES_NO|wx.ICON_QUESTION) # ダイアログの表示 response = dlg.ShowModal() # 「はい」なら終了 if response == wx.ID_YES: dlg.Destroy() self.Close(True) # 「いいえ」なら、ダイアログを閉じるだけ elif response == wx.ID_NO: dlg.Destroy()app = wx.App(False)frame = MyFrame(None, '簡易エディタ')app.MainLoop()