pythonでfoobarのalternativeを作る 13 version 6
:追加された部分
:削除された部分
(差分が大きい場合、文字単位では表示しません)
pythonでfoobarのalternativeを作る 13
190520 開発日記
## TreeCtrl 表示
- 何とかできた(・∀・)ノ
とりあえずだけどDBViewerのgridをtreeに変えてみた
左下はFoobar2000、ほぼ同じようなtreeになってる
https://live.staticflickr.com/65535/40923555523_438d08c7df_b.jpg
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=<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されたときに対応が容易な方法は何か、そこら辺が検討材料ですな(・∀・)
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されたときに対応が容易な方法は何か、そこら辺が検討材料ですな(・∀・)