Skip to content
On this page

Tkinter & OpenAI

這邊要以 ChapGPT 作為翻譯引擎,製作一個翻譯介面。 trans_app

系統需求

  • 須先取得 openai api key
  • 安裝 OpenAI 框架
cmd
pip install openai

創建 main.py 主要檔案並引入 tkinter

py
# main.py
import tkinter as tk
from tkinter import ttk

OpenAI API基本設定

建立 api_key.py 檔案,主要是要與 openai 連線設定,這裡除了api key以外,還須要注意所選擇的model,建議參考官方

py
# api_key.py
import openai
openai.api_key="你的Open API Key"
# 這裡預設2個參數,text 是 input 內容,lang 是翻譯的語言
def trans_engine(text,lang):
    rep=openai.Completion.create(
        # 選擇模組,這裡選擇是GPT-3.5
        model="text-davinci-003",
        # 與AI模組對話
        prompt=f"""幫我翻譯{lang}:{text}""",
        # 模組最大Tokens是4097
        max_tokens=1024,
        # 這裡代表AI回覆的確定性,也就是通用型回覆,在翻譯功能上已經夠用。
        temperature=0.6
    )

引入主檔案

api key設定好之後,就要引入主要檔案內。

py
# main.py
from api_key import trans_engine

win=tk.Tk()
...
# 設定視窗尺寸
win.title('ChatGPT 翻譯')
win.geometry('600x300')
win.resizable(width=False, height=False)
...

建立輸入框版面配置。

py
# main.py
# 設定標籤與輸入欄位
input_row=ttk.Frame(win)
lbl_text=ttk.Label(input_row,text='輸入文字')
lbl_text.pack(side="left")
input_text=tk.Text(input_row,height=5)
input_text.pack(side='left')
...

建立語言選擇版面配置,這裡採用 combobox 方式建立下拉選單。

py
# main.py
# 設定語言清單
...
options=['繁體中文','英文','日文','韓文']
# 設定語言的下拉選單
lang_row=ttk.Frame(win)
lbl_lang=ttk.Label(lang_row,text="選擇語言")
lbl_lang.pac(side='left')
lang_option=ttk.Combobox(lang_row,values=options)
# 預設繁體中文
lang_option.current(0)
lang_option.pack(sidel='left')
...

建立函式

py
# main.py
...
def trans_input():
    # 取用輸入對話
    result=trans_engine(input_text.get(1.0,'end'),lang_option.get())
    # 先刪除要顯示的文字區塊內容
    res_text.delete(0.0,'end')
    # 放到要顯示的文字區塊內
    res_text.insert(0.0,result)

建立按鈕啟動翻譯

py
# main.py
...
btn_trans=ttk.Button(lang_row, text='翻譯', width=20, command=trans_input)
bton_trans.pack(side='left', padx=10)

建立翻譯顯示的文字區塊

py
# main.py
...
res_row=ttk.Frame(win)
lbl_res=ttk.Label(res_row, text='翻譯結果')
lbl_res.pack(side='left')
res_txt=tk.Text(res_row, height=8)
res_text.pack(side='left')

掛上三個區塊版面配置。

py
# main.py
...
input_row.pack(fill='x', padx=5, pady=5)
lang_row.pack(fill='x', padx=5, pady=5)
res_row.pack(fill='x', padx=5, pady=5)

參考