pythonでfoobarのalternativeを作る 10 version 10
:追加された部分
:削除された部分
(差分が大きい場合、文字単位では表示しません)
pythonでfoobarのalternativeを作る 10 # prog
190517の開発
## DBのGUIビューア
- select文の戻り値について、最初の要素しか出力できなかったので書換えた。タプルを一行の文字列にするのって面倒なんだなあ。簡単に書けないんだろうか
今回は文字列にNoneが混じってるのでさらに面倒
```
for l in c.execute(line):
s=''
for ss in l:
if ss==None:
ss='None'
s += ss+'|'
self.m_listBox1.Append(s)
c.close()
conn.close()
```
- そう考えると`print`はすごく使いやすい
で、`print`の出力をそっくり文字列として取得できないか調べた
方法としてはあったけど結構面倒
簡単に出来ないものかね
```
import sys
import io
with io.StringIO() as f: # 文字列IOストリームを初期化して、f に代入
sys.stdout = f # 標準出力を f に切り替える。
for num in range(5): # fに切り替わった標準出力に対してrange(5)の要素を、printで出力
print(num)
text = f.getvalue() # f に出力されたものを文字列として取得
sys.stdout = sys.__stdout__ # 標準出力をデフォルトに戻して text を表示
print("START\n" + text + "END")
```
- でもやっぱりテキストコントロールに区切り文字で出力すると見ずらい。リストを使ったほうがいいよなあ
- ってことでListCtr使おうと思ってwxFormBuilderをいじってたら、gridってのがあってまんまエクセルライクでヨサゲなのでこれ使ってみたら簡単だった(・∀・)ノ
https://live.staticflickr.com/65535/34002169068_2cd47e9783_b.jpg
```
import wx ,sqlite3
import sqlviewer2_ui
class MyFrame( sqlviewer2_ui.MyFrame1 ):
def __init__( self, parent ):
sqlviewer2_ui.MyFrame1.__init__( self, parent )
self.db=r'e:\Programs\python\_研究\database\database.db'
self.btn_refresh(0)
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_go( self, event ):
col=self.m_textCtrl2.GetValue()
exp=self.m_textCtrl3.GetValue()
num=self.m_textCtrl4.GetValue()
line='select '+col+' from '+self.table+' where '+exp+' limit '+num
# グリッドの行設定(列設定してない)
if self.m_grid2.NumberRows < int(num):
self.m_grid2.AppendRows(int(num) - self.m_grid2.NumberRows)
# カラムのラベル設定
for i,l in enumerate(self.colis):
self.m_grid2.SetColLabelValue(i,l)
# でーた取得して挿入
conn = sqlite3.connect( self.db )
c = conn.cursor()
for i1,l in enumerate(c.execute(line)):
for i2,ss in enumerate(l):
if ss==None:
ss='None'
self.m_grid2.SetCellValue(i1,i2,ss)
# print(l)
c.close()
conn.close()
self.m_grid2.AutoSize()
self.Layout() # これ必須
def btn_bye( self, event ):
quit()
if __name__ == '__main__':
app = wx.App(False)
frame = MyFrame(None)
frame.Show(True)
app.MainLoop()
```
- 使い方も簡単、ListCtrlよりも使いやすいと思う
デリメリ
行列を指定しなくちゃいけない
190517の開発
DBのGUIビューア
- select文の戻り値について、最初の要素しか出力できなかったので書換えた。タプルを一行の文字列にするのって面倒なんだなあ。簡単に書けないんだろうか
今回は文字列にNoneが混じってるのでさらに面倒
for l in c.execute(line):
s=''
for ss in l:
if ss==None:
ss='None'
s += ss+'|'
self.m_listBox1.Append(s)
c.close()
conn.close()
- そう考えると
print
はすごく使いやすい
で、print
の出力をそっくり文字列として取得できないか調べた
方法としてはあったけど結構面倒
簡単に出来ないものかね
import sys
import io
with io.StringIO() as f: # 文字列IOストリームを初期化して、f に代入
sys.stdout = f # 標準出力を f に切り替える。
for num in range(5): # fに切り替わった標準出力に対してrange(5)の要素を、printで出力
print(num)
text = f.getvalue() # f に出力されたものを文字列として取得
sys.stdout = sys.__stdout__ # 標準出力をデフォルトに戻して text を表示
print("START\n" + text + "END")
- でもやっぱりテキストコントロールに区切り文字で出力すると見ずらい。リストを使ったほうがいいよなあ
- ってことでListCtr使おうと思ってwxFormBuilderをいじってたら、gridってのがあってまんまエクセルライクでヨサゲなのでこれ使ってみたら簡単だった(・∀・)ノ
import wx ,sqlite3
import sqlviewer2_ui
class MyFrame( sqlviewer2_ui.MyFrame1 ):
def __init__( self, parent ):
sqlviewer2_ui.MyFrame1.__init__( self, parent )
self.db=r'e:\Programs\python\_研究\database\database.db'
self.btn_refresh(0)
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_go( self, event ):
col=self.m_textCtrl2.GetValue()
exp=self.m_textCtrl3.GetValue()
num=self.m_textCtrl4.GetValue()
line='select '+col+' from '+self.table+' where '+exp+' limit '+num
# グリッドの行設定(列設定してない)
if self.m_grid2.NumberRows < int(num):
self.m_grid2.AppendRows(int(num) - self.m_grid2.NumberRows)
# カラムのラベル設定
for i,l in enumerate(self.colis):
self.m_grid2.SetColLabelValue(i,l)
# でーた取得して挿入
conn = sqlite3.connect( self.db )
c = conn.cursor()
for i1,l in enumerate(c.execute(line)):
for i2,ss in enumerate(l):
if ss==None:
ss='None'
self.m_grid2.SetCellValue(i1,i2,ss)
# print(l)
c.close()
conn.close()
self.m_grid2.AutoSize()
self.Layout() # これ必須
def btn_bye( self, event ):
quit()
if __name__ == '__main__':
app = wx.App(False)
frame = MyFrame(None)
frame.Show(True)
app.MainLoop()
- 使い方も簡単、ListCtrlよりも使いやすいと思う
デリメリ
行列を指定しなくちゃいけない