本記事は下記記事の続きであり、PySimpleGUIでデータベースを作成することに特化して解説していきます。
図のような登録ボタンを作成したので、このボタンを押すとデータがデータベースに保存されるトリガーとなるように設定を進めていきます。
データベース作成に必要なライブラリをインポート
sqlite3はpythonでデータベースを操作できるライブラリです。
詳細はHPを参考にしてください。
基本的な記述方法はSQLと変わりません。
※MySQLをPythonで使う方法もありますが今回は使用しません
contextlib モジュールについてはこちらを参考にしてください。
簡単に説明するとPythonでシンプルにwith文を使える便利なモジュールといったところです。
import sqlite3
from contextlib import closing
データベースを作成して接続する
データベースの名前を定義してコネクトします。
dbname = 'メモアプリ.db'
conn = sqlite3.connect(dbname)
登録ボタンが押された際にDBへ保存する
conn.cursor()はデータベースに接続するための定型文です。
c.execute(create_table)でテーブルが作成されます。
以下、itemsというテーブルを作成する文です。(テキスト型のdata、koumoku、naiyouというカラムを用意)
”’create table items (date TEXT,koumoku TEXT,naiyou TEXT)”’
すでにテーブルがある場合は”database already exist”と表示される仕様とします。
次にitemsテーブルにテキストボックスで入力されたデータを挿入する文です。
値を埋めたいところを?にしておきます。
insert_sql = ‘insert into items (date, koumoku, naiyou) values (?,?,?)’
executemanyメソッドでクエリ(SQL文)を実行できます。
executemany(SQL文, タプルのリスト)という構文で今回はSQL文で挿入を行います。
c.executemany(insert_sql, items)
最後に、conn.commit()でデータベースへコミットされ、変更が反映されます。
with closing(sqlite3.connect(dbname)) as conn:
c = conn.cursor()
create_table = '''create table items (date TEXT,koumoku TEXT,naiyou TEXT)'''
try:
c.execute(create_table)
except:
print("database already exist")
insert_sql = 'insert into items (date, koumoku, naiyou) values (?,?,?)'
items = [
(get_date, get_koumoku, get_naiyou)
]
c.executemany(insert_sql, items)
conn.commit()
コード全体
import PySimpleGUI as sg
import sqlite3
from contextlib import closing
sg.theme('DarkBrown2')
dbname = 'メモアプリ.db'
conn = sqlite3.connect(dbname)
layout =[[sg.Text('メモ内容')],
[sg.T('日付', size=(5, 1)), sg.InputText(key='date')],
[sg.T('項目', size=(5, 1)), sg.InputText(key='koumoku')],
[sg.T('内容', size=(5, 1)), sg.InputText(key='naiyou')],
[sg.Button('登録',key='touroku'), sg.Button('閉じる',key='quit',button_color=('white', '#0e6251'))]]
window = sg.Window('メモアプリ_ver3.0', layout, size=(200, 150))
while True:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'quit':
break
elif event == 'touroku':
get_date=values['date']
get_koumoku=values['koumoku']
get_naiyou=values['naiyou']
print('入力された日付は', values['date'], 'です' )
print('入力された項目は', values['koumoku'], 'です' )
print('入力された内容は', values['naiyou'], 'です' )
with closing(sqlite3.connect(dbname)) as conn:
c = conn.cursor()
create_table = '''create table items (date TEXT,koumoku TEXT,naiyou TEXT)'''
try:
c.execute(create_table)
except:
print("database already exist")
insert_sql = 'insert into items (date, koumoku, naiyou) values (?,?,?)'
items = [
(get_date, get_koumoku, get_naiyou)
]
c.executemany(insert_sql, items)
conn.commit()
print('登録完了です' )
window.close()
2回目に登録ボタンを押すとdatabase allready existとコメントが出てきてテーブルがすでに存在していることを表示してくれます。
データは2回入ることになるのでデータベースのテーブルの中身は図のようになります。
データベースファイルはDB4Sなどで開くことができます。