wxPythonメモ

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 – マルチバイト文字列のエンコード・デコード

投稿者:

コメントを残す

メールアドレスが公開されることはありません。