from tkinter import * from tkinter.ttk import * import json # from chatgpt_wrapper import ChatGPT # from revChatGPT.revChatGPT import Chatbot # pip3 install revChatGPT==0.0.a42 from revChatGPT.revChatGPT import AsyncChatbot as Chatbot import asyncio class WinGUI(Tk): def __init__( self ): super ().__init__() self .__win() self .tk_button_send = self .__tk_button_send() self .tk_input_inputs = self .__tk_input_inputs() self .tk_text_show = self .__tk_text_show() self .tk_label_note = self .__tk_label_note() self .process_done = False def __win( self ): self .title( "ChatGPT GUI" ) # 设置窗口大小、居中 width = 500 height = 445 screenwidth = self .winfo_screenwidth() screenheight = self .winfo_screenheight() geometry = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2 , (screenheight - height) / 2 ) self .geometry(geometry) self .resizable(width = False , height = False ) def __tk_button_send( self ): btn = Button( self , text = "发送" ) btn.place(x = 420 , y = 20 , width = 60 , height = 40 ) return btn def __tk_input_inputs( self ): ipt = Entry( self ) ipt.place(x = 20 , y = 20 , width = 380 , height = 40 ) return ipt def __tk_text_show( self ): text = Text( self ) text.place(x = 20 , y = 103 , width = 460 , height = 336 ) return text def __tk_label_note( self ): label = Label( self ,text = " ",anchor=" center") label.place(x = 20 , y = 70 , width = 460 , height = 24 ) return label class Win(WinGUI): def __init__( self ): super ().__init__() self .config(menu = self .create_menu()) self .__event_bind() self .chatbot = Chatbot(json.loads( open ( 'config.json' , 'r' ).read()), conversation_id = None ) self .update_note( 'welcome!' ) def create_menu( self ): menu = Menu( self ,tearoff = False ) return menu def update_show( self , strings): self .tk_text_show.delete( '1.0' , END) self .tk_text_show.insert( '1.0' , strings) self .tk_text_show.update() def update_note( self , strings): self .tk_label_note.config(text = strings) async def wait_for_response( self , inputs): self .update_show('') async for i in await self .chatbot.get_chat_response(inputs, output = "stream" ): print (i[ 'message' ]) self .update_show(i[ 'message' ]) self .process_done = True self .update_note( '回复完成!' ) def bot_ask( self , evt): print ( "<tk_button_send>点击事件" , evt) inputs = self .tk_input_inputs.get().strip() self .process_done = False if inputs: self .update_note(f '>> 输入内容为:{inputs}, 等待回复中...' ) asyncio.run( self .wait_for_response(inputs)) else : self .update_note( '>> 请先输入内容。' ) def __event_bind( self ): self .tk_button_send.bind( '<Button-1>' , self .bot_ask) if __name__ = = "__main__" : win = Win() win.mainloop() |
所有评论(0)