memopy

pythonで作ってみました的なブログ

⑨ 表(テーブル)の作成【python tkinter sqlite3で家計簿を作る】

⑨ 表(テーブル)の作成【python tkinter sqlite3で家計簿を作る】

前回までに登録画面のGUI実装が完了した。
f:id:memopy:20170601225707p:plain
今回は表示画面のGUI作成を行う。始めに、表(テーブル)の作成だ。
表(テーブル)の作成は、ttkモジュールのツリービュー(Treeview)ウィジェットを用いる。

表示画面設計図
f:id:memopy:20170602215840p:plain

ツリービュー 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()

表が作成された。
f:id:memopy:20170602220227p:plain

表の要素に追加するためには、insertメソッドのvaluesオプションに要素をタプル型で渡してあげればよい。
データベースに登録している明細テーブル(acc_data)をSELECT文で抽出し、for文で追加するロジックを立てることになる。
始めにデータベースに登録しているレコードをSELECT文で取得してみる。
f:id:memopy:20170602221303p:plain

# -*- 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)

f:id:memopy:20170602220823p:plain
データベースの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()

データベースのテーブルをツリービューとして表示させた!
f:id:memopy:20170602222017p:plain

~おまけ~
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

f:id:memopy:20170602225817p:plain

今回はここまで!
質問や記事の誤りがありましたらコメントください。

関連記事
ttk Treeview Headingのfontを変更する方法 - memopy

前の記事
⑧ ドロップダウンリストの作成【python tkinter sqlite3で家計簿を作る】
次の記事
⑩ 複数のウィジェットを配置【python tkinter sqlite3で家計簿を作る】