使用wxpython编写一款图形化openai对话脚本

一、首先需申请openai的api key

此部分省略

二、开发过程

1、下载所需的python模块

使用如下命令进行安装

pip install openai
pip install wx

若安装不成功可尝试更换国内源

2、梳理需要实现的功能并编写图形化界面

(1)首先我们需要一个文本输入框

我们需要用文本输入框来输入我们想要向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)  #将文本框添加进刚才的线框中
(2)第二步我们需要一个发送按钮

我们需要定义一个按钮来向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)#生成一个按钮并添加进线框
(3)接下来就是openai向我们返回数据的显示框

这个显示框可以将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)
(4)将上面的代码整合起来
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()

然后是最终完成后的效果

使用wxpython编写一款图形化openai对话脚本_第1张图片

你可能感兴趣的:(python,人工智能,开发语言)