wxPython。分かりやすくメモメモ
簡単にGUIがつくれて良い感じ。
テキストを2つ読み込んで組み合わせを表示するサンプルです

#! 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()
<参考サイト>
python-izm
YAMAGUCHI::weblog – マルチバイト文字列のエンコード・デコード