wxPython。分かりやすくメモメモ
簡単にGUIがつくれて良い感じ。
#! C:\Python27\python.exe # -*- coding: shift-jis -*- import wx # wxPython import xlwt # Excel(書き込み) import sys # いろいろ #----------------------------------------------------------------------------- # 基本フレーム 基本パネル #----------------------------------------------------------------------------- class TestAppFrame(wx.Frame): Appname = ("TestApp") # コンストラクタ的なもの selfはコンテキスト def __init__(self): wx.Frame.__init__(self, None, wx.ID_ANY, self.Appname, size=(900,400)) # ファイルの読み込み in1.txt try: f = open("in1.txt", "r") load_str1 = f.read() f.close() except IOError: self.showMessage("in1.txtが見つかりません") sys.exit() # ファイルの読み込み in2.txt try: f = open("in2.txt", "r") load_str2 = f.read() f.close() except IOError: self.showMessage("in2.txtが見つかりません") sys.exit() # shift-jis を unicode型にデコード (後々文字コードでハマりやすいので内部ではUnicode型に統一する。らしい) load_str1.decode('shift-jis') load_str2.decode('shift-jis') # 要素一覧の生成 load_list1 = load_str1.split("\n") load_list2 = load_str2.split("\n") # メインパネル生成 (1つ) main_panel = wx.Panel(self, wx.ID_ANY) # サブパネル生成 (2つ) sub_list_panel = list_panel(main_panel, load_list1, load_list2) # リストパネル sub_button_panel = button_panel(main_panel) # ボタンパネル # メインレイアウト (メインパネルの上にサブパネルを配置する) main_layout = wx.FlexGridSizer(1,2) main_layout.Add(sub_list_panel, flag=wx.GROW) main_layout.Add(sub_button_panel, flag=wx.GROW) main_layout.AddGrowableCol(0) main_layout.AddGrowableRow(0) # レイアウト確定 main_panel.SetSizer(main_layout) def showMessage(self, word): dig = wx.MessageDialog(self, word, "エラー", wx.OK) dig.ShowModal() dig.Destroy() #----------------------------------------------------------------------------- # リストパネル #----------------------------------------------------------------------------- class list_panel(wx.Panel): # publicな感じ data = [] def __init__(self, main_panel, listdata1, listdata2): wx.Panel.__init__(self, main_panel, wx.ID_ANY) # self.XXXは privateな感じ self.stage1 = listdata1 self.stage2 = listdata2 self.stage3 = [] # リストボックスの生成 (3つ) self.listbox1 = wx.ListBox(self, wx.ID_ANY, size=(200,-1), choices=self.stage1, style=wx.LB_HSCROLL|wx.LB_MULTIPLE) self.listbox2 = wx.ListBox(self, wx.ID_ANY, size=(200,-1), choices=self.stage2, style=wx.LB_HSCROLL|wx.LB_MULTIPLE) self.listbox3 = wx.ListBox(self, wx.ID_ANY, size=(300,-1), choices=self.stage3, style=wx.LB_HSCROLL|wx.LB_SINGLE) # リストボックスのイベントを登録 self.listbox1.Bind(wx.EVT_LISTBOX, self.stage1_select) self.listbox2.Bind(wx.EVT_LISTBOX, self.stage2_select) # リストパネルレイアウト(リストパネルの上にリストウィジェットを配置する) layout = wx.FlexGridSizer(1,3) layout.Add(self.listbox1, flag=wx.GROW|wx.TOP|wx.LEFT|wx.BOTTOM, border=10) layout.Add(self.listbox2, flag=wx.GROW|wx.TOP|wx.LEFT|wx.BOTTOM, border=10) layout.Add(self.listbox3, flag=wx.GROW|wx.TOP|wx.LEFT|wx.BOTTOM, border=10) layout.AddGrowableCol(0) layout.AddGrowableCol(1) layout.AddGrowableCol(2) layout.AddGrowableRow(0) # レイアウト確定 self.SetSizer(layout) def refresh(self): self.cache1 = list(self.listbox1.GetSelections()) self.cache2 = list(self.listbox2.GetSelections()) self.data = [] for i in range(len(self.cache2)): for ii in range(len(self.cache1)): self.data.append( self.stage2[self.cache2[i]] + " x " + self.stage1[self.cache1[ii]] ) self.listbox3.Set(self.data) def stage1_select(self, event): self.refresh() def stage2_select(self, event): self.refresh() #----------------------------------------------------------------------------- # ボタンパネル #----------------------------------------------------------------------------- class button_panel(wx.Panel): def __init__(self, main_panel): wx.Panel.__init__(self, main_panel, wx.ID_ANY) # ボタンの生成 (2つ) button1 = wx.Button(self, wx.ID_ANY, "全てテキストで出力") button2 = wx.Button(self, wx.ID_ANY, "全てExcelで出力") # ボタンのイベントを登録 button1.Bind(wx.EVT_BUTTON, self.click_button_1) button2.Bind(wx.EVT_BUTTON, self.click_button_2) # ボタンパネルレイアウト(ボタンパネルの上にボタンウィジェットを配置する) layout = wx.BoxSizer(wx.VERTICAL) layout.Add(button1, flag=wx.TOP|wx.LEFT|wx.RIGHT, border=10) layout.Add(button2, flag=wx.TOP|wx.LEFT|wx.RIGHT, border=10) # レイアウト確定 self.SetSizer(layout) def click_button_1(self, event): f = open("out.txt", "w") for word in list_panel.data: # こんな感じに他のクラスの変数にアクセス可能 f.write(word.encode('shift-jis') + "\n") # 何らかの文字コードにエンコードしてからwrite f.close() self.showMessage("out.txt を出力しました") def click_button_2(self, event): book = xlwt.Workbook() sheet = book.add_sheet("HAHAHA!!") sheet.write(1,1,"ALL list") for i, word in enumerate(list_panel.data): sheet.write(i + 2,1,word) # Unicode形式のままwrite book.save("out.xls") self.showMessage("out.xls を出力しました") def showMessage(self, word): dig = wx.MessageDialog(self, word, "out", wx.OK) dig.ShowModal() dig.Destroy() #----------------------------------------------------------------------------- # main ここからはじまる #----------------------------------------------------------------------------- if __name__ == "__main__": # main() な感じ app = wx.App() frame = TestAppFrame() # クラスが生成されコンストラクタ的に__init()__が呼び出される frame.Show() app.MainLoop()