python:tkinterとsqlite3でSQLの勉強

#目的
①実業務でSQLを使う機会が増えたのでsqlite3を触って、SQLの理解を深める。
②tkinterも絡ませて、SQLを使ったアプリっぽいものを作成した！という充実感も得る。

#概要
①データベースの作成
→BeautifulSoupとsqlite3を使って事前に作成済み
　（あるスマホゲームのサポートカード一覧データ）
②tkinterでGUIアプリケーションの作成
・sqlite3でDBにSQLのSELECT命令を送り、その結果を表示する
・文字だけでなく、SQL結果と別途画像データ名を同じにしておき、一緒に画像も表示する
③成果物イメージ
![screen 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698556/6e77ce8b-7af8-cad6-6c48-e1f144f40996.png)

#コード

```python:使用モジュール
import tkinter  #GUIで使用
import sqlite3  #データベースをSQL実行
```

```python:tkinter,GUI画面
root = tkinter.Tk()
root.title("GUIタイトル")

#Canvasの設置------------------------------------------------------------
#表示するウィンドウの大きさと背景色の設定
canvas = tkinter.Canvas(root,width=1000,height=600,bg="black")
canvas.pack()

#Canvasに貼り付ける画像の取得------------------------------------------------
#一旦、SQL実行前は、トップ画像を貼り付ける
Photo = tkinter.PhotoImage(file="トップ画像.png")

#画像の貼り付け位置と画像の指定、画像にタグ付けをしておく
canvas.create_image(200,300,image=Photo,tag="P")

#ラベルの設置--------------------------------------------------------------
#ウィンドウに表示しておきたいテキストラベルの設置

label1 = tkinter.Label(root,text="？？？",font=("System",24),bg="white")
label1.place(x=400,y=60)
label2 = tkinter.Label(root,text="検索ワード",font=("System",24),bg="white")
label2.place(x=400,y=300)

#ボタンの設置--------------------------------------------------------------
#クリックしたらSQLを実行する・結果を順次表示するボタンの設置

#ボタンを押したら、下記述の「SQLExe」関数の実行（SQLを実行してDBの検索実行）
btn1 = tkinter.Button(root,text="SQL実行",font=("System",24),bg="white",command=SQLExe)
btn1.place(x=400,y=450)

#ボタンを押したら、下記述の「NextShow」関数の実行（SQL検索結果の順次表示）
btn2 = tkinter.Button(root,text="結果表示",font=("System",24),bg="white",command=NextShow)
btn2.place(x=550,y=450)

#検索実行後、ヒットした件数を表示
btn3 = tkinter.Button(root,text="検索個数",font=("System",24),bg="white")
btn3.place(x=700,y=450)

#テキストの設置-------------------------------------------------------------
#SQLで検索するキーワードの入力テキストボックスの設置

Tb1 = tkinter.Entry(width=40)
Tb2 = tkinter.Entry(width=40)
Tb3 = tkinter.Entry(width=40)
Tb1.place(x=400,y=350)
Tb2.place(x=400,y=380)
Tb3.place(x=400,y=410)

root.mainloop()
```

```python:SQL実行関数
def SQLExe():
    
    global GName,GEffect
    
#SQLで部分一致に使用する単語の作成　→ 「WHERER ~ LIKE %A% AND LIKE %B%」のような
    Check = [Tb1.get(),Tb2.get(),Tb3.get()]
    Word = ["'%" + i + "%'" for i in Check if i != ""]    
    Words = " AND 文字表示するDBのカラム like ".join(Word)
    
    DbName = "使用するDB.db" 
    Conn = sqlite3.connect(DbName)
    Cur = Conn.cursor()
    
    GName = []
    GEffect = []

#SQLの実行　
#検索するのは、テキストボックスに入力した文字が表示文字カラムに含まれているかどうか

    SQL = Cur.execute(f"select 画像名カラム , 表示文字カラム from DBテーブル名 where 表示文字カラム like {Words}")
    for i ,j in SQL.fetchall():
        GN = i
        GE = j.replace("\u3000","\n")　　#表示する文字の調整

#検索して表示したい画像名をGNameへ、文字をGEffectへ格納
        GName.append(GN)
        GEffect.append(GE)

#検索にヒットした件数の表示        
    btn3["text"] = "検索結果: " + str(len(GName)) + "個"
```

```python:画像表示関数
Cnt = 0
def NextShow():
    global Photo , Cnt
    
#検索した画像名が一番最後に到達したら一番最初に戻る
    if Cnt >= len(GName):
        Cnt = 0
    
#表示されているタグ"P"の画像を削除
    canvas.delete("P")

#検索にヒットした画像を順々に表示する
    Photo = tkinter.PhotoImage(file=f"表示画像パス/{GName[Cnt]}.png")
    canvas.create_image(200,300,image=Photo,tag="P")
    
#文字表示も変更する
    label1["text"] = GEffect[Cnt]
    Cnt += 1
```

#所感
・SELECT文だけですが、SQLのいい勉強になりました。
・SQL結果が視覚的・GUI的に表示されていく様を見るのはよい。
→嬉しいし、楽しい。やる気上がる。
→作ったものが視覚的に動く様を見るのはいいですね！！
・tkinterを絡ませるとアプリっぽいものを作成しつつ、楽しみながら、今回のSQLのような勉強ができるので個人的には非常によい発見。

以上。