본문 바로가기

Python

[Python 프로젝트] 맛집 리뷰 자동화 만들기 #2 GUI 만들기

728x90
반응형
SMALL
 

[Python 프로젝트] 맛집 리뷰 자동화 만들기 #1 함수 맛보기

예전에 내 맛집 포스팅을 보고는 내용이 비슷비슷하여사진만 넣으면 알아서 써주는 프로그램을 만들어보라고지나가던 말을 해주던 사람이 있었는데 도전해 봅니다. 아직 기초 중에 기초밖에

creatolog.tistory.com

 

 

#1 포스팅 완료 후 다음 단계 가자니까 뜬금없이 GUI부터 만들어주는 뤼튼 씨.

저는 말 잘 듣는 사람이니 GUI부터 해봅시다.

GUI는 정말 아무것도 없는 빈 창밖에 안 만들어 봤소.

 

 

0. review_gui.py 새 파일 생성하고 시작합니다.

 

 

1. tkinter 임포트
import tkinter as tk
from tkinter import ttk

 

 

2. 기본 윈도 생성
class ReviewMaker:
    def _init(self):
        self.window = tk.Tk()
        self.window.title("리뷰 메이커 v2.0")

 

 

3. 입력 폼 추가하기
def add_basic_info(self):
    basic_frame = tk.Frame(self.window)
    basic_frame.pack(pady=5)
    
    fields = ['가게명:', '위치:', '분위기:', '가격대:']
    self.entries = {}
    
    tk.Label(row, text=field, width=8).pack(side='left')
    self.entries[field] = tk.Entry(row)
    self.entries[field].pack(side='left',expand=True, fill='x')

 

 

4. 창이 안 떠요.

- init에서 mainloop()가 빠졌어.

class ReviewMaker:
    def _init(self):
        self.window = tk.Tk()
        self.window.title("리뷰 메이커 v2.0")
        
        # 기본 정보 입력 함수 호출
        self.add_basic_info()
        
        # 창 실행
        self.window.mainloop();

def add_basic_info(self):
    basic_frame = tk.Frame(self.window)
    basic_frame.pack(pady=5)
    
    fields = ['가게명:', '위치:', '분위기:', '가격대:']
    self.entries = {}
    
    tk.Label(row, text=field, width=8).pack(side='left')
    self.entries[field] = tk.Entry(row)
    self.entries[field].pack(side='left',expand=True, fill='x')
    
# 실행
if _name_ == "_main_":
    app = ReviewMaker()

 

 

5. 메뉴 입력
def add_menu_input(self):
    menu_frame = tk.LabelFrame(self.window,text="메뉴 입력")
    menu_frame.pack(padx=5, pady=5, fill='x')
    
    # 메뉴 입력 행 추가 버튼
    add_btn = tk.Button(menu_frame, text="메뉴 추가", command=self.add_menu_row)
    add_btn.pack(pady=5)
    
    self.menu_rows() = [] # 메뉴 입력 행 저장용
    self.add_menu_row() # 첫 번째 메뉴 행 추가
    
def add_menu_row(self):
    row = tk.Frame(menu_frame)
    row.pack(fill='x', padx=5, pady=2)
    
    menu = tk.Entry(row, width=20)
    price = tk.Entry(row, width=10)
    
    tk.Label(row, text="메뉴:").pack(side='left')
    menu.pack(side='left', padx=5)
    tk.Label(row, text="가격:").pack(side='left')
    price.pack(side='left', padx=5)
    
    self.menu_rows.append((menu, price))
def _init(self):
        self.window = tk.Tk()
        self.window.title("리뷰 메이커 v2.0")
        
        # 기본 정보 입력 함수 호출
        self.add_basic_info()
        self.add_menu_input() # 추가
        
        # 창 실행
        self.window.mainloop();

 

 

6. 선생님. 실행이 안 돼요. 나 타자 연습 한 거야?
빨간(색은 아니지만 에러인) 줄이 너무 많아서 1도 모르겠습니다.
GUI 기초 없이 따라 하려니까 모르겠지만 소스 정리 다시 해줘서 아무튼 해봅니다.
from tkinter import *
from tkinter import ttk

class ReviewMaker:
    def __init__(self):
        self.window = Tk()
        self.window.title("리뷰 메이커 v2.0")
        self.basic_info()
        self.menu_info()
        self.window.mainloop()

    def basic_info(self):
        frame = Frame(self.window)
        frame.pack(pady=5)
        
        fields = ['가게명:', '위치:', '분위기:', '가격대:']
        self.entries = {}
        
        for f in fields:
            row = Frame(frame)
            row.pack(fill='x', padx=5, pady=2)
            Label(row, text=f, width=8).pack(side='left')
            self.entries[f] = Entry(row)
            self.entries[f].pack(side='left', expand=True, fill='x')

    def menu_info(self):
        self.menu_frame = LabelFrame(self.window, text="메뉴 입력")
        self.menu_frame.pack(padx=5, pady=5, fill='x')
        
        btn = Button(self.menu_frame, text="메뉴 추가", command=self.add_row)
        btn.pack(pady=5)
        
        self.menu_rows = []
        self.add_row()

    def add_row(self):
        row = Frame(self.menu_frame)
        row.pack(fill='x', padx=5, pady=2)
        
        menu = Entry(row, width=20)
        price = Entry(row, width=10)
        
        Label(row, text="메뉴:").pack(side='left')
        menu.pack(side='left', padx=5)
        Label(row, text="가격:").pack(side='left')
        price.pack(side='left', padx=5)
        
        self.menu_rows.append((menu, price))

app = ReviewMaker()

 

 

앞전에 했던 코드는 모두 잊어주세요. 어차피 실무는 복붙이에요.

그러므로 복붙 합니다. 이해는 했냐고요? 네, 뭐 대충은요.

UI 되게 깔끔하게 잘 만들었네요. 메뉴 추가 누르면 메뉴 입력할 수 있는 칸이 추가됩니다.

 

 

7. 리뷰 생성 버튼 및 결과 창 생성
def create_review(self):
        review_text = Text(self.window, height=10, width=50)
        review_text.pack(padx=5, pady=5)
        
        create_btn = Button(self.window, text="리뷰 생성", command=lambda: self.generate())
        create_btn.pack(pady=5)

들여 쓰기가 마음대로 안 되네요. def 한 단계 들여 쓰기 해줘야 해요. 클래스로 묶여 있어요.

이번에는 성공적으로 받아쓰기 잘했습니다.

def __init__(self):
        self.window = Tk()
        self.window.title("리뷰 메이커 v2.0")
        self.basic_info()
        self.menu_info()
        self.create_review() # 여기 추가
        self.window.mainloop()

여기도 마찬가지로 def 들여 쓰기 한 칸 더 있습니다.

아무튼 방금 만든 리뷰 생성 버튼 및 결과 창 생성하는 함수 호출도 해줍니다.

우와 이제 진짜 리뷰메이커가 완성되었어요. 물론 껍데기만.

 

 

8. 리뷰 생성
def generate(self):
        store = self.entries['가게명:'].get()
        location = self.entries['위치:'].get()
        mood = self.entries['분위기:'].get()
        price = self.entries['가격대:'].get()
        
        menus = []
        for menu, price in self.menu_rows:
            if menu.get() and price.get():
                menus.append(f"{menu.get()} ({price.get()}원)")
        
        review = f"[{store}]\n"
        review += f"위치 : {location}\n"
        review += f"분위기 : {mood}\n"
        review += f"가격대 : {price}\n\n"
        review += "메뉴 : \n" + "\n".join(menus)
        
        self.review_text.delete(1.0, END)
        self.review_text.insert(END, review)

입력한 내용을 토대로 진짜 간략하게 리뷰를 작성했습니다.

이건 나중에 진짜 리뷰같이 바꿔줍시다^^.

def create_review(self):
        self.review_text = Text(self.window, height=10, width=50)
        self.review_text.pack(padx=5, pady=5)
        
        create_btn = Button(self.window, text="리뷰 생성", command=lambda: self.generate())
        create_btn.pack(pady=5)

아무튼 변경해 주래서 했습니다.

데이터도 뤼튼이 시키는 대로 넣어봤는데 이상한 값이 들어갑니다.

def generate(self):
        store = self.entries['가게명:'].get().strip()
        location = self.entries['위치:'].get().strip()
        mood = self.entries['분위기:'].get().strip()
        price_range = self.entries['가격대:'].get().strip()
        
        review = f"[{store}]\n"
        review += f"위치: {location}\n"
        review += f"분위기: {mood}\n"
        review += f"가격대: {price_range}\n\n"
        review += "메뉴:\n"
        
        for menu, price in self.menu_rows:
            menu_text = menu.get().strip()
            price_text = price.get().strip()
            if menu_text and price_text:
                review += f"{menu_text} ({price_text}원)\n"
        
        self.review_text.delete(1.0, END)
        self.review_text.insert(END, review)

함수 수정해 줘서 붙여 넣기 했더니 잘 됩니다.

 

 

원래 없던 스펙인데, 리뷰 저장이야기 하길래 복사면 될 것 같다니까 바로 만들어줌.

9. 리뷰 복사
def create_review(self):
        self.review_text = Text(self.window, height=10, width=50)
        self.review_text.pack(padx=5, pady=5)
        
        btn_frame = Frame(self.window)
        btn_frame.pack(pady=5)
        
        Button(btn_frame, text="리뷰 생성", command=self.generate).pack(side='left', padx=2)
        Button(btn_frame, text="복사하기", command=self.copy_review).pack(side='left', padx=2)

복사하기 버튼 추가해 주고.

def copy_review(self):
        self.window.clipboard_clear()
        self.window.clipboard_append(self.review_text.get(1.0, END))

함수도 만들어줍니다.

복사하기 누르면 복사 잘 됩니다.

 

 

뤼튼이 너무 떠 매겨주니까 제 실력이 느는 것 같긴 한데요.

원래 이러면서 배우는 거지. 나 자바 처음 배울 때 SQL이 뭔지도 모르고 DB 연결부터 배움.

뤼튼이랑은 수다나 떨고, 챗지피티랑 하다 만 기초 진도부터 빼야겠다^^

아닌데 AI 연결하는 거까지는 해봐야 하는데, 이거 진도 다시 상기시키기 귀찮으니 찍먹 한번 합시다.

 

 

728x90
반응형
LIST