AIoT

AIoT 정규 29일차

맥기짱짱 2024. 2. 7. 17:29

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