wxPythonでAA管理ツールを作ろう!第三回 AAListと辞書

あいさつ

つかさです。今まではコマンドラインランチャ編と同じような進行でしたが、今回からいよいよAA管理ツールっぽいことをしていきます。
リストボックスにAAListフォルダ内のファイルが一覧表示されるようにします。

準備

AAlist.pyと同じフォルダに、AAListというフォルダを作ります。

その中に、

となるファイルを、いくつか作ってください。



AAList内のファイル名をリスト化

前回から、MyTxtFrmクラスの初期化メソッドのところに数行追加してます。

  • AAlist04.py
import wx,os

class MyTxtFrm(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id)
        
        aa_list = os.listdir("AAList")
        self.AA_Dict = {}
        for x in aa_list:
            key = os.path.splitext(x)[0].decode("shift-jis")
            path = os.path.join("AAlist",x)
            self.AA_Dict[key] = path

        self.TxtCtr = wx.TextCtrl(self, -1)
        self.LBox = wx.ListBox(self, -1, choices = self.AA_Dict.keys())
        self.TxtCtr.Bind(wx.EVT_KEY_DOWN, self.OnKeyChar)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.TxtCtr, 0, wx.EXPAND)
        self.sizer.Add(self.LBox, 1, wx.EXPAND)
        self.SetSizer(self.sizer)
        self.SetAutoLayout(1)
        self.sizer.Fit(self)


    def OnKeyChar(self,event):
        key = event.GetKeyCode()
        if key ==  wx.WXK_ESCAPE:
            wx.Exit()
        elif key == wx.WXK_UP:
            count = self.LBox.GetCount()
            next = self.LBox.GetSelection() - 1
            if next >=  0:
                self.LBox.SetSelection(next)
            else: self.LBox.SetSelection(count - 1)
        elif key == wx.WXK_DOWN:
            count = self.LBox.GetCount()
            next = self.LBox.GetSelection() + 1
            if next < count:
                self.LBox.SetSelection(next)
            else: self.LBox.SetSelection(0)
        else: event.Skip()

class MyApp(wx.PySimpleApp): 
    def OnInit(self):

        self.TxtFrm = MyTxtFrm(None, -1)
        self.TxtFrm.SetSize( (180, 200) )
        self.TxtFrm.Show()
        self.TxtFrm.TxtCtr.SetFocus()
        return 1

app = MyApp()
app.MainLoop()
osモジュールのインポート

まずは一番上をご覧ください。

import wx,os

となってますね。フォルダ内のファイルの情報を得るため、osモジュールが必要なのでimportしてます。

AAList内のファイル名一覧をリスト化

osモジュールには、listdir()という関数があります。これは、特定のフォルダ内にあるファイルをリスト化してくれる関数です。

aa_list = os.listdir("AAList")

これで、AAListフォルダ内のファイルをリスト化しているわけです。
中身は、

 ["つかさ.txt","ティッシュやるから元気出せよ.txt","うーっす(キック).txt",
  "おはようじょ.txt","まじで.txt","ゆのっち.txt"(以下略)]

のようになってます。

辞書でファイル名とパスを結びつける

ついでこのリストを利用して、ファイル名をキーに。パスを値とした、辞書を作成します。

        self.AA_Dict = {}
        for x in aa_list:
            key = os.path.splitext(x)[0].decode("shift-jis")
            path = os.path.join("AAlist",x)
            self.AA_Dict[key] = path

まず空の辞書を作ります。
ついで、リスト内の各要素への操作を、for文を使うことで行ってます。
forのブロックの中で、

  1. keyにファイル名から拡張子を取り除いたものを入れ、デコードする
  2. pathにos.path.joinで結合して作ったパスを入れる
  3. self.Dict[key] = pathで拡張子を除いたファイル名をキーに。パスを値に

このようにして一々辞書にキーと値のペアを追加していき、ファイル名とパスとが一対一対応した辞書を作るわけです。
中身は

 {"つかさ":"AAList\つかさ.txt",
   "ティッシュやるから元気出せよ":"AAList\ティッシュやるから元気出せよ.txt",
   "うーっす(キック)":"AAList\うーっす(キック).txt"(以下略)}

のようになってます。

ListBoxにセット

self.AA_Dict.keys()

で、辞書のキーをリストとして取り出すことができます。中身はファイル名の一覧ですね。
これをリストボックスにセットします。

self.LBox = wx.ListBox(self, -1, choices = self.AA_Dict.keys())