0 pythonでfoobarのalternativeを作る 13

190520 開発

TreeCtrl 表示

  • 何とかできた(・∀・)ノ
    とりあえずだけどDBViewerのgridをtreeに変えてみた
    左下はFoobar2000、ほぼ同じようなtreeになってる

import wx ,sqlite3
import sqlviewer4_ui

class MyFrame( sqlviewer4_ui.MyFrame1 ):
    def __init__( self, parent ):
        sqlviewer4_ui.MyFrame1.__init__( self, parent )
        self.db=<pass>
        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されたときに対応が容易な方法は何か、そこら辺が検討材料ですな(・∀・)
0

メモを他の人に見せる

このメモを見せたい人に、このURL(今開いているページのURLです)を教えてあげてください

コメント(0)

  • someone

  • someone