--- Title: pythonでfoobarのalternativeを作る 10 Author: yamasyuh68 Web: https://mimemo.io/m/WrRz7l7d3x4NaA6 --- 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/47972138841_cd5ba1bfbb_z.jpg ``` import wx ,sqlite3 import sqlviewer2_ui class MyFrame( sqlviewer2_ui.MyFrame1 ): def __init__( self, parent ): sqlviewer2_ui.MyFrame1.__init__( self, parent ) self.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よりも使いやすいと思う デリメリ 行列を指定しなくちゃいけない