tkinterとsqlite3(SQLite)を使ってみた際の備忘録です。
sqlite3でdatetimeを(擬似的に)扱う方法については下記を参考にしている。
色々と実装例を見ていると、フロントエンドとバックエンドで構成するほうが良さそうだが、今回はサンプルということで一つのコードにまとめてしまっている。
作ったアプリは下記のようなメッセージを登録・表示できるだけのアプリ。
アプリの動作概要としては、
- 画面上部のフォームにメッセージを入力して、
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のより詳細な使い方については、以前下記の記事でもまとめているので、よろしければご覧ください。
あと、上のポストにも書いているのだけど、tkinterで日本語入力が行えないことの解決方法についてはZennにも記載していますので、そちらも併せて参照してみてください。
(原因を調べた限り、Macでtkinterを使おうとすると結構この問題については遭遇する方も多そうなので、こちらのリンクもはらせてもらいます)