3) 쿼리문을 이용해서 추천 메커니즘 구상 & 4) GUI를 사용해 해당 기능 구현
: 총 720개 게임 리스트, 143,820개의 리뷰를 MySQL로 LOAD 하는 데는 성공했다. 이제 MySQL 쿼리문사용해 게임 타이틀을 검색하면 리뷰에 달린 좋아요 수를 기준으로 높은 순으로 정렬해서 display 할 수 있게 만들어보자.
간단한 SQL 쿼리문을 만들어보면 다음과 같다.
SELECT game_name FROM games WHERE game_name like '%Hogwarts%';
호그와트라는 키워드를 검색했다고 가정하고 실행시켜 보자.
이제 이런 쿼리문을 사용해서 TkInter로 인터페이스를 꾸며보자.
import tkinter as tk
import mysql.connector
from tkinter import messagebox, Toplevel
def search_reviews():
game_name = entry.get()
conn = mysql.connector.connect(user='유저이름', password='비밀번호', host='호스트', database='데이터베이스이름')
cursor = conn.cursor()
cursor.execute(f"SELECT game_name FROM games WHERE game_name like '%{game_name}%'")
results = cursor.fetchall()
for result in results:
game_button = tk.Button(root, text=result[0], command=lambda game=result[0]: open_review_window(game))
game_button.pack()
def open_review_window(game):
review_window = Toplevel(root)
review_window.title(f"Reviews for {game}")
conn = mysql.connector.connect(user='유저이름', password='비밀번호', host='호스트', database='데이터베이스이름')
cursor = conn.cursor()
cursor.execute(f"SELECT username, useful, funny, recommend, review_text, date_review from reviews where game_id = (SELECT game_id FROM games WHERE game_name = '{game}') order by useful desc")
reviews = cursor.fetchall()
for review in reviews:
review_label = tk.Label(review_window, text=review)
review_label.pack()
root = tk.Tk()
root.title("Game Review Search")
label = tk.Label(root, text="Enter Game Name:")
label.pack()
entry = tk.Entry(root)
entry.pack()
search_button = tk.Button(root, text="Search Reviews", command=search_reviews)
search_button.pack()
root.mainloop()
search_reviews에서 게임이름과 같은 정보가 entry.get()을 통해 들어오면 검색할 수 있게 설정하고, open_review_window에서는 타이틀을 클릭했을 때에 username, useful, funny, recommend, review_text, date_review가 뜰 수 있게 설정하였다.
하지만 리뷰를 전부다 볼 수 없는 현상이 나타났고 가독성도 낮았다. 그래서 리뷰를 다 볼 수 있게 스크롤 기능을 추가시키고 가독성 증가를 위해서 여러 필드의 정보를 정렬해서 표시했다. 마지막으로 리뷰는 Bold처리를 해서 가독성을 높였다.
import tkinter as tk
import mysql.connector
from tkinter import messagebox, Toplevel
def search_reviews():
game_name = entry.get()
conn = mysql.connector.connect(user='유저', password='비밀번호', host='호스트', database='데이터베이스이름')
cursor = conn.cursor()
cursor.execute(f"SELECT game_name FROM games WHERE game_name like '%{game_name}%'")
results = cursor.fetchall()
for result in results:
game_button = tk.Button(root, text=result[0], command=lambda game=result[0]: open_review_window(game))
game_button.pack()
from tkinter import font, Canvas, Scrollbar
def open_review_window(game):
review_window = Toplevel(root)
review_window.title(f"Reviews for {game}")
conn = mysql.connector.connect(user='유저', password='비밀번호', host='호스트', database='데이터베이스이름')
cursor = conn.cursor()
cursor.execute(f"SELECT username, useful, funny, recommend, review_text, date_review from reviews where game_id = (SELECT game_id FROM games WHERE game_name = '{game}') order by useful desc")
reviews = cursor.fetchall()
# 폰트와 크기 설정
custom_font = font.Font(family="Helvetica", size=12)
bold_font = font.Font(family="Helvetica", size=12, weight='bold')
# 스크롤 가능한 캔버스 생성
canvas = Canvas(review_window)
scrollbar = Scrollbar(review_window, command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)
canvas.pack(side='left', fill='both', expand=True)
scrollbar.pack(side='right', fill='y')
# 캔버스에 프레임 추가
frame = tk.Frame(canvas)
canvas.create_window((0,0), window=frame, anchor='n')
for review in reviews:
review_frame = tk.Frame(frame)
review_frame.pack(fill='x')
username_label = tk.Label(review_frame, text=f"Username: {review[0]}", font=custom_font)
username_label.pack(side='left')
useful_label = tk.Label(review_frame, text=f"Useful: {review[1]}", font=custom_font)
useful_label.pack(side='left')
funny_label = tk.Label(review_frame, text=f"Funny: {review[2]}", font=custom_font)
funny_label.pack(side='left')
recommend_label = tk.Label(review_frame, text=f"Recommend: {review[3]}", font=custom_font)
recommend_label.pack(side='left')
review_text_label = tk.Label(review_frame, text=f"Review: {review[4]}", font=bold_font)
review_text_label.pack(side='left')
date_review_label = tk.Label(review_frame, text=f"Date: {review[5]}", font=custom_font)
date_review_label.pack(side='left')
# 프레임의 크기가 변경될 때 스크롤 영역 업데이트
frame.update_idletasks()
canvas.config(scrollregion=canvas.bbox('all'))
root = tk.Tk()
root.title("Game Review Search")
label = tk.Label(root, text="Enter Game Name:")
label.pack()
entry = tk.Entry(root)
entry.pack()
search_button = tk.Button(root, text="Search Reviews", command=search_reviews)
search_button.pack()
root.mainloop()
'AIoT' 카테고리의 다른 글
AIoT 정규 31일차 (0) | 2024.02.15 |
---|---|
AIoT 정규 30일차 (2) | 2024.02.13 |
AIoT 정규 28일차 (0) | 2024.02.06 |
AIoT 정규 27일차 (1) | 2024.02.06 |
AIoT 정규 26일차 (0) | 2024.02.02 |