0 pythonでfoobarのalternativeを作る 10

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=<pass>
        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よりも使いやすいと思う

デリメリ
行列を指定しなくちゃいけない

0

メモを他の人に見せる

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

コメント(0)

  • someone

  • someone