此部分省略
使用如下命令进行安装
pip install openai
pip install wx
若安装不成功可尝试更换国内源
我们需要用文本输入框来输入我们想要向openai提问的问题
可以使用wxpython的TextCtrl函数来进行文本输入框的生成
但在这之前,我们需要定义一个基本的框架类
class chat_gui(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, id=wx.ID_ANY, title=u"Openai-GPT3.0", pos=wx.DefaultPosition,size=wx.Size(850, 600), style=wx.DEFAULT_DIALOG_STYLE | wx.TAB_TRAVERSAL)
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
gui_all = wx.BoxSizer(wx.VERTICAL) #定义了一个线框使得界面更加美观
######
#此处是需编写的文本框和发送按钮等内容
######
self.SetSizer(gui_all)
self.Layout()
self.Centre(wx.BOTH)
然后我们就可以编写一个文本输入框并将其添加进框架中
block_input = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, u"请输入您想问的问题"), wx.VERTICAL)#定义一个文本输入框
self.input1 = wx.TextCtrl(block_input.GetStaticBox(),wx.ID_ANY,value='',style=wx.TE_MULTILINE,size=wx.Size(800,100)) #设置文本框的各种属性
block_input.Add(self.input1,0,wx.ALL,5) #将文本框添加进刚才的线框中
我们需要定义一个按钮来向openai发送我们输入的问题
self.send = wx.Button(block_input.GetStaticBox(),wx.ID_ANY,u"发送", wx.DefaultPosition,wx.DefaultSize, 0)
block_input.Add(self.send,0,wx.ALL,5)
gui_all.Add(block_input, 0, wx.EXPAND | wx.ALL, 5)#生成一个按钮并添加进线框
这个显示框可以将openai的回答显示在文本框中
block_back = wx.StaticBoxSizer(wx.StaticBox(self,wx.ID_ANY,u"Openai的回复"),wx.VERTICAL)
self.back1 = wx.TextCtrl(block_back.GetStaticBox(),wx.ID_ANY,value='',style=wx.TE_MULTILINE,size=wx.Size(800,400))
text=self.back1
block_back.Add(self.back1,0,wx.ALL,5)
class chat_gui(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, id=wx.ID_ANY, title=u"Openai-GPT3.0", pos=wx.DefaultPosition,size=wx.Size(850, 600), style=wx.DEFAULT_DIALOG_STYLE | wx.TAB_TRAVERSAL)
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
gui_all = wx.BoxSizer(wx.VERTICAL)
block_input = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, u"请输入您想问的问题"), wx.VERTICAL)
self.input1 = wx.TextCtrl(block_input.GetStaticBox(),wx.ID_ANY,value='',style=wx.TE_MULTILINE,size=wx.Size(800,100))
block_input.Add(self.input1,0,wx.ALL,5)
self.send = wx.Button(block_input.GetStaticBox(),wx.ID_ANY,u"发送", wx.DefaultPosition,wx.DefaultSize, 0)
block_input.Add(self.send,0,wx.ALL,5)
gui_all.Add(block_input, 0, wx.EXPAND | wx.ALL, 5)
block_back = wx.StaticBoxSizer(wx.StaticBox(self,wx.ID_ANY,u"Openai的回复"),wx.VERTICAL)
self.back1 = wx.TextCtrl(block_back.GetStaticBox(),wx.ID_ANY,value='',style=wx.TE_MULTILINE,size=wx.Size(800,400))
text=self.back1
block_back.Add(self.back1,0,wx.ALL,5)
gui_all.Add(block_back,0,wx.EXPAND | wx.ALL,5)
self.SetSizer(gui_all)
self.Layout()
self.Centre(wx.BOTH)
self.send.Bind(wx.EVT_BUTTON, self.send_click)#绑定按钮事件,为后续的事件方法做准备
首先使程序获取我们输入的内容
sendtext=str(self.input1.GetValue())
然后使用openai官方给出的调用api的文档进行调用
response = openai.Completion.create(
model='text-davinci-003',
prompt=sendtext,#将上述获取的用户输入作为参数发送给api
temperature=0.5,
max_tokens=3000,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
)
将api返回的信息显示在文本框中
self.back1.Clear()#清除上一次返回的内容
text=str(response.choices[0].text)
self.back1.WriteText(text)#更新文本框内容
将上面的代码进行整合
def send_click(self,event):
sendtext=str(self.input1.GetValue())
response = openai.Completion.create(
model='text-davinci-003',
prompt=sendtext,
temperature=0.5,
max_tokens=3000,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
)
self.back1.Clear()
text=str(response.choices[0].text)
self.back1.WriteText(text)
event.Skip()
在使用wxpython进行图形化界面编程时,我们总是需要一个应用程序对象,否则就无法显示我们设计的框架
class App(wx.App):#定义应用程序类
def OnInit(self):
frame = chat_gui()#调用框架类
frame.Show()#使框架显示在屏幕上
self.SetTopWindow(frame)
return True
if __name__ == '__main__':
app = App(False)
app.MainLoop()#应用程序主循环
下面是完整的代码
import openai
import wx
openai.api_key = '**********' #申请到的api key
class chat_gui(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, id=wx.ID_ANY, title=u"Openai-GPT3.0", pos=wx.DefaultPosition,size=wx.Size(850, 600), style=wx.DEFAULT_DIALOG_STYLE | wx.TAB_TRAVERSAL)
self.SetSizeHints(wx.DefaultSize, wx.DefaultSize)
gui_all = wx.BoxSizer(wx.VERTICAL)
block_input = wx.StaticBoxSizer(wx.StaticBox(self, wx.ID_ANY, u"请输入您想问的问题"), wx.VERTICAL)
self.input1 = wx.TextCtrl(block_input.GetStaticBox(),wx.ID_ANY,value='',style=wx.TE_MULTILINE,size=wx.Size(800,100))
block_input.Add(self.input1,0,wx.ALL,5)
self.send = wx.Button(block_input.GetStaticBox(),wx.ID_ANY,u"发送", wx.DefaultPosition,wx.DefaultSize, 0)
block_input.Add(self.send,0,wx.ALL,5)
gui_all.Add(block_input, 0, wx.EXPAND | wx.ALL, 5)
block_back = wx.StaticBoxSizer(wx.StaticBox(self,wx.ID_ANY,u"Openai的回复"),wx.VERTICAL)
self.back1 = wx.TextCtrl(block_back.GetStaticBox(),wx.ID_ANY,value='',style=wx.TE_MULTILINE,size=wx.Size(800,400))
text=self.back1
block_back.Add(self.back1,0,wx.ALL,5)
gui_all.Add(block_back,0,wx.EXPAND | wx.ALL,5)
self.SetSizer(gui_all)
self.Layout()
self.Centre(wx.BOTH)
self.send.Bind(wx.EVT_BUTTON, self.send_click)
def send_click(self,event):
sendtext=str(self.input1.GetValue())
response = openai.Completion.create(
model='text-davinci-003',
prompt=sendtext,
temperature=0.5,
max_tokens=3000,
top_p=1.0,
frequency_penalty=0.0,
presence_penalty=0.0,
)
self.back1.Clear()
text=str(response.choices[0].text)
self.back1.WriteText(text)
event.Skip()
class App(wx.App):
def OnInit(self):
frame = chat_gui()
frame.Show()
self.SetTopWindow(frame)
return True
if __name__ == '__main__':
app = App(False)
app.MainLoop()
然后是最终完成后的效果