--- Title: pythonでfoobarのalternativeを作る 13 Author: yamasyuh68 Web: https://mimemo.io/m/q9ON1lX5nA4LrAD --- 190520 開発 ## TreeCtrl 表示 - 何とかできた(・∀・)ノ とりあえずだけどDBViewerのgridをtreeに変えてみた 左下はFoobar2000、ほぼ同じようなtreeになってる https://live.staticflickr.com/65535/47972078542_3bd9201503_z.jpg ``` import wx ,sqlite3 import sqlviewer4_ui class MyFrame( sqlviewer4_ui.MyFrame1 ): def __init__( self, parent ): sqlviewer4_ui.MyFrame1.__init__( self, parent ) self.db= self.btn_refresh(0) self.m_textCtrl5.SetValue('''select albumartist ,date,album,tracknumber, title ,fullpath from musics order by albumartist ,date,album,tracknumber limit 500''' ) # この関数無くてもいいんだけど(¯―¯٥) def btn_refresh( self, event ): conn = sqlite3.connect( self.db ) c = conn.cursor() c.execute("select * from sqlite_master where type='table'") table=c.fetchone()[1] # 最初のテーブル名 des=c.execute('select * from {}'.format(table) ).description colis=[item[0] for item in des] i=0 nonull=[] null=[] for col in colis : res=c.execute( 'select count(*) from {} where {} IS NULL'.format(table,colis[i]) ) null.append(res.fetchall()[0][0]) res=c.execute( 'select count(*) from {} where {} IS NOT NULL'.format(table,colis[i]) ) nonull.append(res.fetchall()[0][0]) i+=1 self.m_staticText1.SetLabel('DATABASE -- {}'.format(self.db)) self.m_staticText2.SetLabel(' Table -- {}'.format(table)) all=[colis,nonull,null] line='' for i in all: for ii in i : line += '{:>10}'.format(ii) line += '\r\n' self.m_textCtrl1.SetValue(line) self.table=table # global に使うことにした self.colis=colis c.close() conn.close() def btn_go2( self, event ): line=self.m_textCtrl5.GetValue() self.sqlexecute(line) def sqlexecute( self, line ): self.m_treeCtrl1.DeleteAllItems() conn = sqlite3.connect( self.db ) c = conn.cursor() # albumartist ,date,album,tracknumber , title,fullpath item=['',''] getitem=['','','','',"",""] tree=[None,None,None] tree[0] = self.m_treeCtrl1.AddRoot('root', -1, -1, -1) # rootとして挿入 for l in c.execute(line): # print(l) for i in range(5): if l[i]==None: # タプルをリストに置き換える getitem[i]='?' else: getitem[i]=l[i] if getitem[0] != item[0] : # 1 a-artist tree[1] = self.m_treeCtrl1.AppendItem(tree[0],getitem[0], -1, -1 ) item[0]=getitem[0] getitem[1] = '[' + getitem[1] + ']' + getitem[2] if getitem[1] != item[1] : # 1 date album tree[2] = self.m_treeCtrl1.AppendItem(tree[1],getitem[1], -1, -1 ) item[1]=getitem[1] getitem[3] += ' ' + getitem[4] self.m_treeCtrl1.AppendItem(tree[2],getitem[3], -1, -1 ,getitem[5]) c.close() conn.close() def btn_clear(self,e): self.m_treeCtrl1.DeleteAllItems() def btn_bye( self, event ): quit() if __name__ == '__main__': app = wx.App(False) frame = MyFrame(None) frame.Show(True) app.MainLoop() ``` - とりあえず表示することが目標、強引なコードのような気もするがチューンアップはまた後でってことで(¯―¯٥) - インクリメンタルサーチをどう実装しよう?? -select~where like %**%~ order by ~ で検索は出来る。しかしその都度executeするのはどうなんだろ?そのためのDBなのかな -fetchall したものを保持しておいて、treeにappendでフィルタをかけるか?? -treeの内部データはどこにあるんだろう。これに直接フィルタをかけれないのかな? - foobarと比較すると、微妙な違いがある。DB作成ルーチン変えたほうが良いのかな。forでまわしてタプルに追加する機械的な方式ではなくて、最初からタグごとに処理をして、それからタプルに追加していく。 --tracknumberの二桁化 --titleが無いときはファイル名をタイトルにする 一度単純にDBを作ってしまい、取り出すときに加工する方法もあるな あるいは加工したDBを別に作っておくとか?? どの方法が速いか、動作中にファイルがupdateされたときに対応が容易な方法は何か、そこら辺が検討材料ですな(・∀・)