at backyard

Color my life with the chaos of trouble.

tkinterとsqlite3を使ってGUIアプリを作ってみる

tkinterとsqlite3(SQLite)を使ってみた際の備忘録です。

sqlite3でdatetimeを(擬似的に)扱う方法については下記を参考にしている。

qiita.com

色々と実装例を見ていると、フロントエンドとバックエンドで構成するほうが良さそうだが、今回はサンプルということで一つのコードにまとめてしまっている。

作ったアプリは下記のようなメッセージを登録・表示できるだけのアプリ。

f:id:shinshin86:20220105232147p:plain

アプリの動作概要としては、

  • 画面上部のフォームにメッセージを入力して、Save to SQLite ボタンを押すことでsqlite3を使ってSQLiteにデータを書き込む。
  • また、画面下部にある View all data ボタンを押すことでSQLite内のすべてのデータを取得してListbox内に表示する。

以上のようなとてもシンプルなアプリ。

実際のソースコードは下記となる。

import tkinter as tk
import tkinter.messagebox as tkm
import sqlite3
from datetime import datetime

DB_NAME = "msg.db"

# msg.dbが作られていない場合は作成を行う
def init_db_table():
    # set converter
    detect_types = sqlite3.PARSE_DECLTYPES | sqlite3.PARSE_COLNAMES
    sqlite3.dbapi2.converters['DATETIME'] = sqlite3.dbapi2.converters['TIMESTAMP']

    conn = sqlite3.connect(DB_NAME)
    cur = conn.cursor()
    sql_statement = "CREATE TABLE IF NOT EXISTS msg (id INTEGER PRIMARY KEY, message TEXT, created_at datetime)"
    cur.execute(sql_statement)
    conn.commit()
    conn.close()


# DB内のデータを全件取得
def view():
    conn = sqlite3.connect(DB_NAME)
    cur = conn.cursor()
    cur.execute("select * from msg")
    raws = cur.fetchall()
    conn.close()
    return raws


# DBにデータを追加する
def insert(message):
    conn = sqlite3.connect(DB_NAME)
    cur = conn.cursor()
    sql_statement = "insert into msg values(NULL, ?, ?)"
    cur.execute(sql_statement, (message, datetime.now()))
    conn.commit()
    conn.close()


# insert関数を通じて入力されたmessageを保存するための関数
def save_msg(message):
    insert(message)
    tkm.showinfo("Save", "Save message")


# view関数を通じて取得した全件分のデータを整形してListboxに表示するための関数
def view_msg(listbox):
    listbox.delete(0, tk.END)
    for row in view():
        data = "ID: " + str(row[0]) + ", Message: " + row[1] + ", CreatedAt:" + str(row[2])
        listbox.insert(tk.END, data)


# アプリ起動時にDBが作られていない場合はDBの初期化を行う
init_db_table()

# GUIの初期化
root = tk.Tk()

label = tk.Label(root, text="Your message")
label.pack()

text_form = tk.Entry(root)
text_form.pack()

save_button = tk.Button(root, text="Save to SQLite", width=20, command=lambda: save_msg(text_form.get()))
save_button.pack()

listbox = tk.Listbox(root, width=50, height=15)
listbox.pack()

view_button = tk.Button(root, text="View all data", width=20, command=lambda: view_msg(listbox))
view_button.pack()


root.title("sqlite3 sample")
root.geometry("600x400")
root.mainloop()

コードについては以上となる。

tkinterのより詳細な使い方については、以前下記の記事でもまとめているので、よろしければご覧ください。

shinshin86.hateblo.jp

あと、上のポストにも書いているのだけど、tkinterで日本語入力が行えないことの解決方法についてはZennにも記載していますので、そちらも併せて参照してみてください。
(原因を調べた限り、Mactkinterを使おうとすると結構この問題については遭遇する方も多そうなので、こちらのリンクもはらせてもらいます)

zenn.dev