import wx
import telnetlib
from time import sleep
# import _thread as thread
from chatbot import baidu_api, chatbot, play_mp3, remove_voice, getText
from config import BOT, default_server, VOICE_SWITCH
from recorder import *
import threading
bot_use = BOT
class LoginFrame(wx.Frame):
"""
登录窗口
"""
def __init__(self, parent, id, title, size):
# 初始化,添加控件并绑定事件
wx.Frame.__init__(self, parent, id, title)
self.SetSize(size)
self.Center()
self.serverAddressLabel = wx.StaticText(self, label="服务地址", pos=(45, 40), size=(120, 25))
self.userNameLabel = wx.StaticText(self, label="用户名", pos=(45, 90), size=(120, 25))
self.serverAddress = wx.TextCtrl(self, value=default_server,
pos=(120, 37), size=(150, 25), style=wx.TE_PROCESS_ENTER)
self.userName = wx.TextCtrl(self, pos=(120, 87), size=(150, 25), style=wx.TE_PROCESS_ENTER)
self.loginButton = wx.Button(self, label='登录', pos=(50, 145), size=(90, 30))
self.exitButton = wx.Button(self, label='退出', pos=(180, 145), size=(90, 30))
# 绑定登录方法
self.loginButton.Bind(wx.EVT_BUTTON, self.login)
# 绑定退出方法
self.exitButton.Bind(wx.EVT_BUTTON, self.exit)
# 服务器输入框Tab事件
self.serverAddress.SetFocus()
self.Bind(wx.EVT_TEXT_ENTER, self.usn_focus, self.serverAddress)
# 用户名回车登录
self.Bind(wx.EVT_TEXT_ENTER, self.login, self.userName)
self.Show()
# 回车调到用户名输入栏
def usn_focus(self, event):
self.userName.SetFocus()
def login(self, event):
# 登录处理
try:
serverAddress = self.serverAddress.GetLineText(0).split(':')
con.open(serverAddress[0], port=int(serverAddress[1]), timeout=10)
response = con.read_some()
if response != b'Connect Success':
self.showDialog('Error', 'Connect Fail!', (200, 100))
return
con.write(('login ' + str(self.userName.GetLineText(0)) + '\n').encode("utf-8"))
response = con.read_some()
if response == b'UserName Empty':
self.showDialog('Error', 'UserName Empty!', (200, 100))
elif response == b'UserName Exist':
self.showDialog('Error', 'UserName Exist!', (200, 100))
else:
self.Close()
ChatFrame(None, 2, title='当前用户:'+str(self.userName.GetLineText(0)), size=(515, 400))
except Exception:
self.showDialog('Error', 'Connect Fail!', (95, 20))
def exit(self, event):
self.Close()
# 显示错误信息对话框
def showDialog(self, title, content, size):
dialog = wx.Dialog(self, title=title, size=size)
dialog.Center()
wx.StaticText(dialog, label=content)
dialog.ShowModal()
class ChatFrame(wx.Frame):
"""
聊天窗口
"""
def __init__(self, parent, id, title, size):
# 初始化,添加控件并绑定事件
wx.Frame.__init__(self, parent, id, title, style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX |
wx.DEFAULT_FRAME_STYLE)
self.SetSize(size)
self.Center()
self.chatFrame = wx.TextCtrl(self, pos=(5, 5), size=(490, 310), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.sayButton = wx.Button(self, label="语音", pos=(5, 320), size=(58, 25))
self.message = wx.TextCtrl(self, pos=(65, 320), size=(280, 25), style=wx.TE_PROCESS_ENTER)
self.sendButton = wx.Button(self, label="发送", pos=(360, 320), size=(58, 25))
# self.usersButton = wx.Button(self, label="Users", pos=(373, 320), size=(58, 25))
self.closeButton = wx.Button(self, label="关闭", pos=(436, 320), size=(58, 25))
self.sendButton.Bind(wx.EVT_BUTTON, self.send) # 发送按钮绑定发送消息方法
self.message.SetFocus() # 输入框回车焦点
self.sayButton.Bind(wx.EVT_LEFT_DOWN, self.sayDown) # SAY按钮按下
self.sayButton.Bind(wx.EVT_LEFT_UP, self.sayUp) # Say按钮弹起
self.Bind(wx.EVT_TEXT_ENTER, self.send, self.message) # 回车发送消息
# self.usersButton.Bind(wx.EVT_BUTTON, self.lookUsers) # Users按钮绑定获取在线用户数量方法
self.closeButton.Bind(wx.EVT_BUTTON, self.close) # 关闭按钮绑定关闭方法
treceive = threading.Thread(target=self.receive) # 接收信息线程
treceive.start()
# self.ShowFullScreen(True) # 全屏
self.Show()
def sayDown(self, event):
trecording = threading.Thread(target=recording)
trecording.start()
def sayUp(self, event):
sayText = getText(r"E:\python_pycharm\ChatBot\voice\voice.wav")
self.message.AppendText(str(sayText))
self.send(self)
def send(self, event):
# 发送消息
message = str(self.message.GetLineText(0)).strip()
global bot_use
if message != '':
if message == "机器人":
bot_use = "ChatBot"
self.message.Clear()
con.write(('noone_say 成功呼叫语音助手!' + '\n').encode("utf-8"))
return
elif message == "用户聊天":
bot_use = "User"
self.message.Clear()
con.write(('noone_say 语音助手已离开' + '\n').encode("utf-8"))
return
con.write(('say ' + message + '\n').encode("utf-8"))
self.message.Clear()
# 机器人回复
if bot_use == "ChatBot":
answer = chatbot(message)
con.write(('chatbot_say ' + answer + '\n').encode("utf-8"))
elif bot_use == "User":
return
if VOICE_SWITCH:
# 写本地音乐文件
baidu_api(answer)
# 新建线程播放音乐
tplay_mp3 = threading.Thread(target=play_mp3)
tplay_mp3.start()
# thread.start_new_thread(play_mp3, ())
return
# def lookUsers(self, event):
# # 查看当前在线用户
# con.write(b'look\n')
def close(self, event):
# 关闭窗口
tremove_voice = threading.Thread(target=remove_voice)
tremove_voice.start()
# thread.start_new_thread(remove_voice, ())
con.write(b'logout\n')
con.close()
self.Close()
def receive(self):
# 接受服务器的消息
while True:
sleep(1)
result = con.read_very_eager()
if result != '':
self.chatFrame.AppendText(result)
def saytime(self):
i = 0
while True:
self.chatFrame.AppendText('正在录音...' + str(i) + '秒\n')
sleep(1)
i = i + 1
if __name__ == '__main__':
app = wx.App()
con = telnetlib.Telnet()
LoginFrame(None, -1, title="语音聊天机器人", size=(320, 250))
app.MainLoop()
小胡说人工智能
- 粉丝: 1w+
- 资源: 51
最新资源
- 西门子s7 200smart与3台英威腾GD变频器通讯实战程序 原创可直接用于生产的程序,程序带注释,并附送触摸屏程序,有接线方式和设置,通讯地址说明等 程序采用轮询,可以后续根据要求适当修
- 标签打印C#控制程序源代码,适合自己进行二次开发 软件可以自己编辑标签,可以自动条形码或二维码的位置
- 松下FP-XHC60T 标准可带18轴中型程序,总共逻辑1万多步,含昆仑通态触摸屏程序(触摸屏附带配方功能,以及产能统计:), 项目功能完整主站与两个从站采用PLC链接通讯,该程序为标准框架,故障,复
- WPF智慧工厂数据平台 1, 提供一个智慧工厂数据平台框架 2,理解wpf的设计模式 3,学习如何绘制各种统计图 4,设计页面板块划分 5,如何在适当时候展现动画 有盆友问,这个是否带数据库
- yolo目标检测数据-抽烟、打电话、打哈欠数据集5665张含yolo标签文件(可用于疲劳检测、司机行为检测).zip
- FLAC3D锚杆辅助生成软件根据CAD图自动打锚杆 使用感受 在CAD画出锚杆,启动软件会生成锚杆命令流,call入flac中即可或者复制到自己命令流中,十分便捷 由于开发成软件,永久使用
- 施耐德ATV71原厂纸质原理图纸 施耐德ATV71变频器原理图纸,可以用来研究变频器电路的结构组成、控制原理,为搞清楚变频电路的控制原理、信号的来龙去脉提供科学依据,更能够做为变频器
- 信捷XC PLC与3台施耐德ATV12变频器通讯程序 信捷XC PLC与3台施耐德ATV12变频器通讯,可靠稳定,同时解决施耐德ATV12变频器断电重启后,自准备工作,无需人为准备 器件:信捷XC3
- 电动自行车方案,资料齐全 成熟电动自行车代码方案,学习好资料 中颖中颖电动自行车代码方案,包含代码,原理图,pcb,说明文档 不论是学习电动车代码还是学习电流环,速度环,Pid调节,都是很好
- 三菱PLC FX5U 伺服机器人程序 包括三菱FX5U程序,威纶通触摸屏程序,IO表,材料清单,eplan和PDF电气图 4轴伺服程序,1个机器人,FX5U结构化编程
- 电机启动模型 Matlab simulink 可用于模拟电压暂降等电能质量问题,适配于本家的IEEE 33节点模型
- python入门-外星人小游戏
- 高压大功率电动汽车360V方案 电动汽车高压电机控制器360v乘用车平台,某知名电控厂家主推 产品,软件源代码,软件FOC矢量控制算法,boot源码,全部开源,强大的上位机调试工具带实时波形显示,原理
- matlab 多智能体系统编队控制仿真,非线性,一致性,领导跟随控制,有限时间控制等
- 蛋白质功能预测中的深度学习方法:结合序列与互作网络的深层分类模型(DeepGO)
- 三菱纯水设备程序纯水设备程序 使用三菱A系列 PLC和三菱A985GOT触摸屏,也可以额外有偿转移指其他触摸屏,比如昆仑通态和威纶通还有信捷等等
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈