2023. 11. 22. 19:28
import tkinter as tk
from io import BytesIO
from tkinter import ttk, messagebox
import openai
import os
import requests
from PIL import Image, ImageTk
from reportlab.lib.pagesizes import letter
from reportlab.lib.units import inch
from reportlab.platypus import SimpleDocTemplate, Image as ReportLabImage, Paragraph
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase.cidfonts import UnicodeCIDFont

API_KEY = os.environ.get('OPENAI_API_KEY')
openai.api_key = API_KEY

pil_image_path = "c:\\temp\\animal_play_image.png"

def create_pdf(dialog_text):
if len(dialog_text) == 0:
messagebox.showerror("Error",
"Please generate the dialog first!")
return
pdfmetrics.registerFont(TTFont("맑은고딕", "malgun.ttf"))
doc = SimpleDocTemplate("output.pdf", papersize=letter)

contents = []
img = ReportLabImage(pil_image_path,
width=2.5*inch,
height=2.5*inch)
contents.append(img)

dialog_text = '<br/>' + dialog_text
dialog_text = dialog_text.replace('\n', '<br/><br/>')
styles = getSampleStyleSheet()
styles.add(ParagraphStyle(
name="Hangul",
fontName="맑은고딕"
))
paragraph = Paragraph(dialog_text, styles['Hangul'])

contents.append(paragraph)

doc.build(contents)

messagebox.showinfo("PDF Created", "PDF created successfully!")


def generateImage(animal1, animal2, scenario):
response = openai.Image.create(
model='dall-e-3',
#prompt=f"cartoon image of a {animal1} and a {animal2} discussing {scenario}",
prompt=f"{animal1}() {animal2}() {scenario}에서 이야기하고 있는 카툰 이미지",
n=1,
size="1024x1024",
response_format="url"
)

image_url = response.data[0]["url"]
return image_url

def update_label_with_new_image(label, photo):
label.config(image=photo)
label.image = photo

def display_image_from_url(image_holder, url):
response = requests.get(url)
image_data = BytesIO(response.content)

image = Image.open(image_data)
image.save(pil_image_path, "PNG")
photo = ImageTk.PhotoImage(image)

update_label_with_new_image(image_holder, photo)


def submit():
animal1 = combo1.get()
animal2 = combo2.get()
scenario = entry_box.get()
# 사자와 판다사이에 각각의 동물이 서로 말을 주고받는 10줄의 연극대본을 작성하여라. 작성할 시나리오는 다음과 같다. 그들이 만나는 장소: 스타벅스
# prompt = f"Create a play between a {animal1} and a {animal2} with 10 lines of dialog with each animal taking " \
# f"turns to speak. Hear the scenario in which they will engage: {scenario}\n";
prompt = f"{animal1}() {animal2}사이에 각각의 동물이 서로 말을 주고받는 10줄의 연극대본을 작성하여라. 작성할 시나리오는 다음과 같다. 그들이 만나는 장소: {scenario}\n"


messages = [{'role': 'user', 'content': prompt}]
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages = messages,
temperature=0.8,
presence_penalty=0.6,
)

chatGPTAnswer = response["choices"][0]["message"]["content"]
print(chatGPTAnswer)

result_text.config(state="normal")
result_text.delete(1.0, tk.END) # Clear any previous results
# result_text.insert(tk.END, f"Animal 1: {animal1}\n")
# result_text.insert(tk.END, f"Animal 2: {animal2}\n")
# result_text.insert(tk.END, f"Discussion scenario: {scenario}\n")
result_text.insert(tk.END, chatGPTAnswer)
result_text.config(state="disabled")

image_url = generateImage(animal1, animal2, scenario)
display_image_from_url(image_holder, image_url)

app = tk.Tk()
app.title("Animal Discussion Scenario")

# Label and ComboBox for the first animal
label1 = ttk.Label(app, text="Select Animal 1:")
label1.grid(column=0, row=0, padx=10, pady=5)
combo1 = ttk.Combobox(app, values=["사자", "코끼리", "기린", "캥거루", "판다"])
combo1.grid(column=1, row=0, padx=10, pady=5)
combo1.set("사자")

#Label and ComboBox for the second animal
label2 = ttk.Label(app, text="Select Animal 2:")
label2.grid(column=0, row=1, padx=10, pady=5)
combo2 = ttk.Combobox(app, values=["사자", "코끼리", "기린", "캥거루", "판다"])
combo2.grid(column=1, row=1, padx=10, pady=5)
combo2.set("코끼리")

# Label and Entry for entering the discussion scenario
label3 = ttk.Label(app, text="Enter Discussion Scenario:")
label3.grid(column=0, row=2, padx=10, pady=5)
entry_box = ttk.Entry(app, width=30)
entry_box.grid(column=1, row=2, padx=10, pady=5)

# Button to submit the details
submit_btn = ttk.Button(app, text="Submit", command=submit)
submit_btn.grid(column=1, row=3, padx=10, pady=20)

# Button to submit the details to pdf
create_pdf_btn = ttk.Button(app, text="Create Pdf", command=
lambda: create_pdf(result_text.get(1.0, tk.END)))
create_pdf_btn.grid(column=2, row=3, padx=10, pady=20)

# scrollbar
scrollbar = tk.Scrollbar(app)
scrollbar.grid(row=4, column=3, sticky='ns')

# Text widget to display results
result_text = tk.Text(app, width=40, height=10, wrap=tk.WORD, yscrollcommand=scrollbar.set)
result_text.grid(column=0, row=4, columnspan=2, padx=10, pady=10)

scrollbar.config(command=result_text.yview)

image_holder = tk.Label(app)
image_holder.grid(column=0, row=5, columnspan=4, padx=10, pady=10)

app.mainloop()

'python' 카테고리의 다른 글

babel fish  (1) 2023.11.23
사자와 코끼리가 휴대폰 대리점에 나누는 대화  (2) 2023.11.22
챗gpt 전체소스  (1) 2023.11.22
dall-e-3 image 생성 - 한국어로 변경  (1) 2023.11.22
dall-e-3를 활용한 이미지 생성  (0) 2023.11.22
Posted by 다만사