⑨ 表(テーブル)の作成【python tkinter sqlite3で家計簿を作る】
⑨ 表(テーブル)の作成【python tkinter sqlite3で家計簿を作る】
前回までに登録画面のGUI実装が完了した。
今回は表示画面のGUI作成を行う。始めに、表(テーブル)の作成だ。
表(テーブル)の作成は、ttkモジュールのツリービュー(Treeview)ウィジェットを用いる。
表示画面設計図
ツリービュー Treeview
はじめに簡単なサンプルスクリプトを作成して、ウィジェットの機能を確認する。
# モジュールのインポート import tkinter as tk import tkinter.ttk as ttk # ルートフレームの作成 root = tk.Tk() # ツリービューの作成 tree = ttk.Treeview(root) # 列インデックスの作成 tree["columns"] = (1,2,3) # 表スタイルの設定(headingsはツリー形式ではない、通常の表形式) tree["show"] = "headings" # 各列の設定(インデックス,オプション(今回は幅を指定)) tree.column(1,width=75) tree.column(2,width=75) tree.column(3,width=100) # 各列のヘッダー設定(インデックス,テキスト) tree.heading(1,text="日付") tree.heading(2,text="内訳") tree.heading(3,text="金額") # レコードの作成 # 1番目の引数-配置場所(ツリー形式にしない表設定ではブランクとする) # 2番目の引数-end:表の配置順序を最下部に配置 # (行インデックス番号を指定することもできる) # 3番目の引数-values:レコードの値をタプルで指定する tree.insert("","end",values=("2017/5/1","食費",3500)) tree.insert("","end",values=("2017/5/10","光熱費",7800)) tree.insert("","end",values=("2017/5/10","住宅費",64000)) # ツリービューの配置 tree.pack() root.mainloop()
表が作成された。
表の要素に追加するためには、insertメソッドのvaluesオプションに要素をタプル型で渡してあげればよい。
データベースに登録している明細テーブル(acc_data)をSELECT文で抽出し、for文で追加するロジックを立てることになる。
始めにデータベースに登録しているレコードをSELECT文で取得してみる。
# -*- coding:cp932 -*- import sqlite3 c = sqlite3.connect("database.db") # SELECT文の作成 sql = """ SELECT acc_date,item_name,amount FROM acc_data as a,item as i WHERE a.item_code = i.item_code ORDER BY acc_date """ # SQLを発行し、各レコードをタプルで表示 for r in c.execute(sql): print(r)
データベースのacc_dataテーブルの各レコードがタプル型で抽出できることを確認した。
次に、先ほどのツリービューを、データベースから取得したレコードを要素として追加するロジックに変更する。
# モジュールのインポート import tkinter as tk import tkinter.ttk as ttk import sqlite3 # データベースの接続 c = sqlite3.connect("database.db") # SELECT文の作成 sql = """ SELECT acc_date,item_name,amount FROM acc_data as a,item as i WHERE a.item_code = i.item_code ORDER BY acc_date """ # ルートフレームの作成 root = tk.Tk() # ツリービューの作成 tree = ttk.Treeview(root) # 列インデックスの作成 tree["columns"] = (1,2,3) # 表スタイルの設定(headingsはツリー形式ではない、通常の表形式) tree["show"] = "headings" # 各列の設定(インデックス,オプション(今回は幅を指定)) tree.column(1,width=75) tree.column(2,width=75) tree.column(3,width=100) # 各列のヘッダー設定(インデックス,テキスト) tree.heading(1,text="日付") tree.heading(2,text="内訳") tree.heading(3,text="金額") # SELECT文で取得した各レコードを繰り返し取得 for r in c.execute(sql): # ツリービューの要素に追加 tree.insert("","end",values=r) # ツリービューの配置 tree.pack() root.mainloop()
データベースのテーブルをツリービューとして表示させた!
~おまけ~
Treeviewは罫線がなくて表が見づらい。各レコードを2色に設定すると見やすくなる。
上記のコード、for文の中を次のように変更した。
# SELECT文で取得した各レコードを繰り返し取得 i=0 for r in c.execute(sql): # ツリービューの要素に追加(tagを追加することにより、要素を識別できる) tree.insert("","end",tags=i,values=r) # tagが奇数か偶数か判定 if i & 1: # tagが奇数(レコードは偶数)の場合のみ、背景色の設定 tree.tag_configure(i,background="#CCFFFF") i+=1
今回はここまで!
質問や記事の誤りがありましたらコメントください。
関連記事
ttk Treeview Headingのfontを変更する方法 - memopy
前の記事
⑧ ドロップダウンリストの作成【python tkinter sqlite3で家計簿を作る】
次の記事
⑩ 複数のウィジェットを配置【python tkinter sqlite3で家計簿を作る】